Signatur
Beschreibung
Reflect.deleteProperty() ist eine statische Methode des Reflect-Objekts. Sie löscht die Eigenschaft propertyKey vom Objekt target. Damit entspricht sie dem Ausdruck delete target[propertyKey], ist aber eine normale Funktion, die man weitergeben, in Callbacks nutzen oder mit apply aufrufen kann.
Der wichtigste Unterschied zum Operator liegt im Verhalten bei Fehlern: Reflect.deleteProperty() gibt immer einen booleschen Wert zurück, auch im Strict Mode. Der delete-Operator wirft dagegen im Strict Mode einen TypeError, wenn eine nicht konfigurierbare Eigenschaft gelöscht werden soll. Mit Reflect.deleteProperty() lässt sich der Erfolg also ohne try...catch prüfen.
Am häufigsten wird die Methode in deleteProperty-Traps von Proxy-Handlern eingesetzt, um die Standard-Operation weiterzureichen. Das spiegelt die Grundidee der Reflect-API wider: Zu jedem Proxy-Trap gibt es eine passende Reflect-Methode mit derselben Signatur.
Ist target kein Objekt, wirft die Methode einen TypeError. Der Operator würde einen primitiven Wert dagegen stillschweigend in ein Objekt umwandeln.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | object | Das Objekt, von dem die Eigenschaft gelöscht werden soll. Ist es kein Objekt (z. B. null, eine Zahl oder ein String), wird ein TypeError geworfen. |
|
| $propertyKey Pflicht | string|symbol | Name oder Symbol der zu löschenden Eigenschaft. Andere Werte werden in einen String umgewandelt (z. B. 0 zu "0"). |
Rückgabewert
true, wenn die Eigenschaft gelöscht wurde oder gar nicht vorhanden war. false, wenn sie nicht konfigurierbar ist oder das Objekt nicht erweiterbar/eingefroren ist und die Eigenschaft deshalb nicht entfernt werden kann.Beispiele
Grundlegende Verwendung
const user = { name: 'Anna', password: 'geheim' };
console.log(Reflect.deleteProperty(user, 'password'));
console.log(user);
// Eine Eigenschaft, die nicht existiert, gilt ebenfalls als erfolgreich gelöscht
console.log(Reflect.deleteProperty(user, 'gibtEsNicht'));
Erfolg prüfen statt TypeError im Strict Mode
'use strict';
const config = Object.freeze({ apiUrl: 'https://api.example.com' });
// delete config.apiUrl würde hier einen TypeError werfen
const ok = Reflect.deleteProperty(config, 'apiUrl');
if (!ok) {
console.warn('apiUrl ist geschützt und kann nicht entfernt werden.');
}
console.log(config.apiUrl);
Proxy: Löschen geschützter Felder verhindern und protokollieren
const createGuarded = (obj, protectedKeys = []) =>
new Proxy(obj, {
deleteProperty(target, key) {
if (protectedKeys.includes(key)) {
console.log(`Löschen von "${String(key)}" verweigert`);
return false;
}
console.log(`Lösche "${String(key)}"`);
// Standardverhalten weiterreichen
return Reflect.deleteProperty(target, key);
},
});
const session = createGuarded({ id: 42, token: 'abc', cache: {} }, ['id']);
delete session.cache;
delete session.id; // im Sloppy Mode einfach false
console.log(Object.keys(session));
Array-Elemente löschen (Lücken statt Verkürzung)
const list = ['a', 'b', 'c'];
Reflect.deleteProperty(list, 1);
console.log(list, list.length);
// length selbst ist nicht konfigurierbar
console.log(Reflect.deleteProperty(list, 'length'));
// Wichtig · Fallstricke
- Kein Fehler bei Misserfolg: Anders als
deleteim Strict Mode wirft die Methode keinenTypeErrorbei nicht konfigurierbaren Eigenschaften, sondern gibtfalsezurück. Den Rückgabewert also immer auswerten, sonst bleiben Fehlschläge unbemerkt. - Nur Objekte als Ziel:
Reflect.deleteProperty('text', 'length')oder ein Aufruf mitnullwirft einenTypeError. - Nur eigene Eigenschaften: Gelöscht wird nur die eigene Eigenschaft des Objekts. Eine gleichnamige Eigenschaft in der Prototypkette bleibt erhalten und ist danach wieder sichtbar.
- Arrays: Beim Löschen eines Elements entsteht eine Lücke,
lengthändert sich nicht. Zum Entfernen von Elementen bessersplice()oderfilter()nehmen. - Performance: Häufiges Löschen von Eigenschaften kann in JavaScript-Engines wie V8 die Optimierung über Hidden Classes verhindern. In heißen Codepfaden die Eigenschaft lieber auf
undefinedsetzen oder eineMapnutzen. - Proxy-Invarianten: Ein
deleteProperty-Trap darf für eine nicht konfigurierbare Eigenschaft des Ziels nichttruemelden, sonst wird einTypeErrorgeworfen. - Kompatibilität: Wird von allen modernen Browsern und von Node.js ab Version 6 unterstützt. Der Internet Explorer kennt die Methode nicht.