Start · Sprachen · JavaScript · Referenz · handler.deleteProperty()

handler.deleteProperty()

Methode

Trap eines Proxy-Handlers, die die interne Methode <code>[[Delete]]</code> abfängt, etwa beim <code>delete</code>-Operator oder bei <code>Reflect.deleteProperty()</code>.

seit JavaScript ES2015 Kategorie: method-property

Signatur

handler.deleteProperty(target, property)

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

Typ
boolean
Beschreibung
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);
}
{ _id: 42 } Löschen von "_id" verweigert true

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'));
delete theme: vorhanden=true, ok=true delete gibtsNicht: vorhanden=false, ok=true delete lang: vorhanden=true, ok=true true

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
set: birne delete: apfel

// 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).

  • false zurückgeben wirft nur im Strict Mode (und in ES-Modulen/Klassen, die automatisch strikt sind) einen Fehler – im Sloppy Mode schlägt delete still fehl.
  • Reflect.deleteProperty() wirft nie wegen false, 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, obwohl true gemeldet wird – ein häufiger Fehler.

Unterstützt in allen modernen Browsern und Node.js 6+; nicht polyfillbar (kein Support im Internet Explorer).