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

Reflect.deleteProperty()

Methode

Entfernt eine Eigenschaft von einem Objekt, funktioniert wie der <code>delete</code>-Operator als Funktion und gibt zurück, ob das Löschen geklappt hat.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Reflect.deleteProperty(target, propertyKey)

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

Typ
boolean
Beschreibung
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'));
true { name: 'Anna' } true

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);
apiUrl ist geschützt und kann nicht entfernt werden. https://api.example.com

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));
Lösche "cache" Löschen von "id" verweigert [ 'id', 'token' ]

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'));
[ 'a', <1 empty item>, 'c' ] 3 false

// Wichtig · Fallstricke

  • Kein Fehler bei Misserfolg: Anders als delete im Strict Mode wirft die Methode keinen TypeError bei nicht konfigurierbaren Eigenschaften, sondern gibt false zurück. Den Rückgabewert also immer auswerten, sonst bleiben Fehlschläge unbemerkt.
  • Nur Objekte als Ziel: Reflect.deleteProperty('text', 'length') oder ein Aufruf mit null wirft einen TypeError.
  • 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 besser splice() oder filter() 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 undefined setzen oder eine Map nutzen.
  • Proxy-Invarianten: Ein deleteProperty-Trap darf für eine nicht konfigurierbare Eigenschaft des Ziels nicht true melden, sonst wird ein TypeError geworfen.
  • Kompatibilität: Wird von allen modernen Browsern und von Node.js ab Version 6 unterstützt. Der Internet Explorer kennt die Methode nicht.