JavaScript Academy · Les

Praktische toepassingen van Proxy

Bouw validatie, logging en reactieve objecten.

Les 4 van 413 stappen

Praktische toepassingen van Proxy is een gratis JavaScript Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject JavaScript Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus JavaScript Academy bevat in totaal 4 lessen.

Proxy's in de praktijk

Nu combineer je proxies en Reflect om echte problemen op te lossen: validatie, registratie, standaardwaarden en meer. Elk patroon omsluit een gewoon object zonder het te wijzigen.

Validatiewrapper

Handhaaf een schema: weiger elke schrijfbewerking die niet aan een regel voldoet. De target blijft schoon, omdat onjuiste gegevens nooit worden opgeslagen.

function validated(obj, rules) {
  return new Proxy(obj, {
    set(target, prop, value, receiver) {
      const rule = rules[prop];
      if (rule && !rule(value)) {
        throw new TypeError('invalid value for ' + prop);
      }
      return Reflect.set(target, prop, value, receiver);
    }
  });
}

const user = validated({}, { age: v => v >= 0 });
user.age = 25;
console.log(user.age);
try { user.age = -1; } catch (e) { console.log(e.message); }

Wrapper voor registratie

Traceer elke lees- en schrijfbewerking voor foutopsporing door na de registratie via Reflect door te sturen.

function logged(obj) {
  return new Proxy(obj, {
    get(t, p, r) { console.log('GET ' + p); return Reflect.get(t, p, r); },
    set(t, p, v, r) { console.log('SET ' + p + '=' + v); return Reflect.set(t, p, v, r); }
  });
}

const data = logged({ count: 0 });
data.count = 5;
console.log(data.count);

Standaardwaarden

Geef een terugvalwaarde terug voor elke ontbrekende eigenschap, zodat leesbewerkingen nooit undefined opleveren.

function withDefault(obj, fallback) {
  return new Proxy(obj, {
    get(t, p, r) {
      return p in t ? Reflect.get(t, p, r) : fallback;
    }
  });
}

const scores = withDefault({ ada: 90 }, 0);
console.log(scores.ada);
console.log(scores.unknown);

Negatieve array-indexering

Laat arrays negatieve indexen in Python-stijl ondersteunen door ze in een get-trap te vertalen.

function negIndex(arr) {
  return new Proxy(arr, {
    get(t, p, r) {
      const i = Number(p);
      if (Number.isInteger(i) && i < 0) {
        return Reflect.get(t, t.length + i, r);
      }
      return Reflect.get(t, p, r);
    }
  });
}

const list = negIndex(['a', 'b', 'c']);
console.log(list[-1]);
console.log(list[0]);

Alleen-lezenweergave

Stel een object beschikbaar dat wel kan worden gelezen maar nooit beschreven, bijvoorbeeld om gedeelde configuratie te beschermen.

function readonly(obj) {
  return new Proxy(obj, {
    set() { console.log('blocked write'); return false; },
    deleteProperty() { console.log('blocked delete'); return false; }
  });
}

const config = readonly({ apiUrl: '/api' });
config.apiUrl = '/hacked';
console.log(config.apiUrl);

Toegangen tellen

Houd bij hoe vaak elke eigenschap wordt gelezen door de tellingen buiten de target op te slaan.

function counted(obj) {
  const counts = {};
  const proxy = new Proxy(obj, {
    get(t, p, r) {
      counts[p] = (counts[p] || 0) + 1;
      return Reflect.get(t, p, r);
    }
  });
  return { proxy, counts };
}

const { proxy, counts } = counted({ x: 1 });
proxy.x; proxy.x; proxy.x;
console.log(counts.x);

Berekende virtuele eigenschappen

Stel afgeleide waarden beschikbaar die niet worden opgeslagen, maar bij elke leesbewerking opnieuw worden berekend.

const rect = new Proxy({ width: 4, height: 3 }, {
  get(t, p, r) {
    if (p === 'area') return t.width * t.height;
    return Reflect.get(t, p, r);
  }
});

console.log(rect.area);
rect.width = 10;
console.log(rect.area);

Een fout melden bij onbekende leesbewerkingen

Vang typfouten vroeg op door een uitzondering te gooien wanneer code een eigenschap leest die niet bestaat.

function strict(obj) {
  return new Proxy(obj, {
    get(t, p, r) {
      if (typeof p === 'string' && !(p in t)) {
        throw new ReferenceError('unknown property: ' + p);
      }
      return Reflect.get(t, p, r);
    }
  });
}

const o = strict({ name: 'Ada' });
console.log(o.name);
try { console.log(o.naem); } catch (e) { console.log(e.message); }

Aandachtsgebieden combineren

Echte wrappers combineren vaak validatie en registratie in één handler, waarbij elke trap doorstuurt naar Reflect.

const account = new Proxy({ balance: 0 }, {
  set(t, p, v, r) {
    if (p === 'balance' && v < 0) throw new RangeError('no overdraft');
    console.log(p + ' set to ' + v);
    return Reflect.set(t, p, v, r);
  }
});

account.balance = 100;
console.log(account.balance);
try { account.balance = -50; } catch (e) { console.log(e.message); }

Waarom deze patronen belangrijk zijn

Proxies voegen dwarsdoorsnijdend gedrag, validatie, registratie, standaardwaarden en toegangsbeheer toe zonder het oorspronkelijke object of de aanroepers ervan te vervuilen. Zo nemen reactieve frameworks veranderingen in status waar. Gebruik ze wanneer je transparante onderschepping nodig hebt.

const observed = new Proxy({ n: 0 }, {
  set(t, p, v, r) {
    const ok = Reflect.set(t, p, v, r);
    console.log(p + ' is now ' + t[p]);
    return ok;
  }
});
observed.n = 1;
observed.n = 2;

Korte controle

Welke proxy-trap gebruik je om ongeldige waarden te weigeren voordat ze worden opgeslagen?

Samenvatting: praktische gebruikssituaties voor Proxy's

Je hebt proxies toegepast op echte problemen:

  • Validatie in de set-trap weigert onjuiste gegevens.
  • Registratie traceert lees- en schrijfbewerkingen via Reflect.
  • Standaardwaarden en virtuele eigenschappen bevinden zich in de get-trap.
  • Alleen-lezenweergaven, toegangen tellen en strikte controle op typfouten omsluiten objecten allemaal transparant.
Gratis beginnen

Leer JavaScript met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
59
Lessen
200

Veelgestelde vragen

Is de les “Praktische toepassingen van Proxy” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad JavaScript Academy, waaronder “Praktische toepassingen van Proxy”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus JavaScript Academy bevat in totaal 4 lessen.

Wat leer ik in “Praktische toepassingen van Proxy”?

Bouw validatie, logging en reactieve objecten. Je oefent met JavaScript Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met JavaScript Academy te beginnen?

Ervaring vooraf is niet nodig. JavaScript Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Praktische toepassingen van Proxy”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over JavaScript Academy?

Ja. Elke les over JavaScript Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Een Proxy maken
  2. get- en set-traps
  3. De Reflect-API
  4. Praktische toepassingen van Proxy
← Terug naar JavaScript Academy