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

Reflect.isExtensible()

Methode

Prüft, ob einem Objekt neue Eigenschaften hinzugefügt werden können, und liefert <code>true</code> oder <code>false</code>.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Reflect.isExtensible(target)

Beschreibung

Reflect.isExtensible() gibt an, ob ein Objekt erweiterbar ist, ob man ihm also neue Eigenschaften hinzufügen kann. Normale Objekte sind standardmäßig erweiterbar. Nach Object.preventExtensions(), Object.seal(), Object.freeze() oder Reflect.preventExtensions() sind sie es nicht mehr.

Die Methode macht im Kern dasselbe wie Object.isExtensible(). Es gibt aber einen wichtigen Unterschied: Übergibt man etwas, das kein Objekt ist (z. B. eine Zahl oder einen String), löst Reflect.isExtensible() einen TypeError aus. Object.isExtensible() gibt in diesem Fall seit ES2015 einfach false zurück.

Am meisten bringt die Methode in Proxy-Handlern. Sie entspricht direkt der internen Operation [[IsExtensible]] und damit der Trap isExtensible. Im Handler kann man das Standardverhalten so sauber an das Zielobjekt weiterreichen. Auch in Code, der auf Metaprogrammierung ausgerichtet ist und einheitlich die Reflect-API nutzt, ist sie praktisch.

Parameter

Name Typ Default Beschreibung
$target Pflicht object Das Objekt, dessen Erweiterbarkeit geprüft wird. Ist es kein Objekt, wird ein TypeError ausgelöst.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn dem Objekt neue Eigenschaften hinzugefügt werden können, sonst false.

Beispiele

Erweiterbarkeit vor und nach dem Sperren prüfen

const config = { debug: false };
console.log(Reflect.isExtensible(config));

Object.preventExtensions(config);
console.log(Reflect.isExtensible(config));

const sealed = Object.seal({ a: 1 });
const frozen = Object.freeze({ b: 2 });
console.log(Reflect.isExtensible(sealed), Reflect.isExtensible(frozen));
true false false false

Unterschied zu Object.isExtensible bei primitiven Werten

console.log(Object.isExtensible(42));

try {
  Reflect.isExtensible(42);
} catch (err) {
  console.log(err instanceof TypeError, err.message);
}
false true Reflect.isExtensible called on non-object

Proxy-Trap isExtensible protokollieren

const target = { name: 'Ada' };

const proxy = new Proxy(target, {
  isExtensible(t) {
    console.log('Erweiterbarkeit wird geprüft');
    // Standardverhalten weiterreichen – das Ergebnis muss zum Ziel passen
    return Reflect.isExtensible(t);
  }
});

console.log(Object.isExtensible(proxy));
Erweiterbarkeit wird geprüft true

Nur erweiterbare Objekte ergänzen

const addTimestamp = (obj) => {
  if (!Reflect.isExtensible(obj)) {
    console.warn('Objekt ist gesperrt – kein Zeitstempel gesetzt');
    return obj;
  }
  Reflect.defineProperty(obj, 'createdAt', { value: Date.now(), enumerable: true });
  return obj;
};

addTimestamp({ id: 1 });
addTimestamp(Object.freeze({ id: 2 }));
Objekt ist gesperrt – kein Zeitstempel gesetzt

// Wichtig · Fallstricke

  • TypeError bei Nicht-Objekten: Anders als Object.isExtensible() liefert Reflect.isExtensible() bei primitiven Werten nicht false, sondern löst einen Fehler aus. Ist die Eingabe unsicher, vorher mit typeof prüfen oder Object.isExtensible() verwenden.
  • Proxy-Invariante: Eine isExtensible-Trap muss denselben Wert liefern wie Reflect.isExtensible(target). Sonst löst die Engine einen TypeError aus. Deshalb gibt man in der Trap üblicherweise das Ergebnis von Reflect.isExtensible() zurück.
  • Nicht erweiterbar heißt nicht unveränderlich: Bestehende Eigenschaften lassen sich weiterhin ändern oder löschen. Das verhindern erst Object.seal() bzw. Object.freeze().
  • Ein Objekt, das nicht mehr erweiterbar ist, lässt sich nicht wieder erweiterbar machen.
  • Kompatibilität: Die Methode wird in allen modernen Browsern und in Node.js ab Version 6 unterstützt. Der Internet Explorer unterstützt sie nicht.