Signatur
Beschreibung
Die Methode deleteProperty() wird im Handler-Objekt eines Proxy definiert. Sie fängt jeden Versuch ab, eine Eigenschaft vom Proxy zu löschen, zum Beispiel delete proxy.foo, delete proxy[key] oder Reflect.deleteProperty(proxy, key). Ist die Trap nicht definiert, wird der Löschvorgang unverändert an das Zielobjekt weitergereicht.
Typische Einsätze sind Schutz von Eigenschaften (z. B. private Felder mit Unterstrich-Präfix), Protokollierung und Reaktivität: Frameworks wie Vue 3 nutzen diese Trap, um Änderungen an Objekten zu erkennen und die Oberfläche neu zu zeichnen.
Die Trap muss einen Wahrheitswert zurückgeben: true bedeutet, dass die Eigenschaft erfolgreich gelöscht wurde (oder gar nicht existierte), false bedeutet Fehlschlag. Im Strict Mode führt false beim delete-Operator zu einem TypeError; im nicht-strikten Modus liefert delete einfach false.
Innerhalb der Trap sollte das eigentliche Löschen meist an Reflect.deleteProperty(target, property) delegiert werden – so bleibt das Standardverhalten inklusive korrekter Rückgabe erhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | object | Das Zielobjekt, das vom Proxy umhüllt wird. | |
| $property Pflicht | string | symbol | Der Name bzw. das Symbol der zu löschenden Eigenschaft. Zahlen-Schlüssel kommen als string an (z. B. "0"). |
Rückgabewert
true, wenn das Löschen erfolgreich war, sonst false. Andere Rückgabewerte werden in einen Wahrheitswert umgewandelt.Beispiele
Private Eigenschaften vor dem Löschen schützen
'use strict';
const user = { name: 'Anna', _id: 42 };
const geschuetzt = new Proxy(user, {
deleteProperty(target, prop) {
if (typeof prop === 'string' && prop.startsWith('_')) {
console.log(`Löschen von "${prop}" verweigert`);
return false; // im Strict Mode -> TypeError
}
return Reflect.deleteProperty(target, prop);
}
});
delete geschuetzt.name;
console.log(user);
try {
delete geschuetzt._id;
} catch (err) {
console.log(err instanceof TypeError);
}
Löschvorgänge protokollieren
const settings = { theme: 'dark', lang: 'de' };
const logged = new Proxy(settings, {
deleteProperty(target, prop) {
const existed = Object.hasOwn(target, prop);
const ok = Reflect.deleteProperty(target, prop);
console.log(`delete ${String(prop)}: vorhanden=${existed}, ok=${ok}`);
return ok;
}
});
delete logged.theme;
delete logged.gibtsNicht;
console.log(Reflect.deleteProperty(logged, 'lang'));
Einfache Reaktivität: Änderungen melden
const reactive = (obj, onChange) => new Proxy(obj, {
set(target, prop, value) {
const ok = Reflect.set(target, prop, value);
onChange('set', prop);
return ok;
},
deleteProperty(target, prop) {
const had = Object.hasOwn(target, prop);
const ok = Reflect.deleteProperty(target, prop);
if (had && ok) onChange('delete', prop);
return ok;
}
});
const cart = reactive({ apfel: 3 }, (type, key) => console.log(`${type}: ${key}`));
cart.birne = 2;
delete cart.apfel;
delete cart.apfel; // keine Meldung, war schon weg
// Wichtig · Fallstricke
Invarianten: Die Engine prüft das Ergebnis der Trap. Ein TypeError wird geworfen, wenn die Trap true meldet, obwohl die Eigenschaft im Ziel als nicht konfigurierbar (configurable: false) existiert, oder wenn sie als eigene Eigenschaft existiert und das Zielobjekt nicht erweiterbar ist (seit ES2020).
falsezurückgeben wirft nur im Strict Mode (und in ES-Modulen/Klassen, die automatisch strikt sind) einen Fehler – im Sloppy Mode schlägtdeletestill fehl.Reflect.deleteProperty()wirft nie wegenfalse, sondern gibt den Wert einfach zurück.- Die Trap greift nur für Operationen auf dem Proxy; wer direkt auf das Zielobjekt zugreift, umgeht sie.
- Vergisst man das eigentliche Löschen (
Reflect.deleteProperty), bleibt die Eigenschaft bestehen, obwohltruegemeldet wird – ein häufiger Fehler.
Unterstützt in allen modernen Browsern und Node.js 6+; nicht polyfillbar (kein Support im Internet Explorer).