Signatur
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
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));
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);
}
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));
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 }));
// Wichtig · Fallstricke
- TypeError bei Nicht-Objekten: Anders als
Object.isExtensible()liefertReflect.isExtensible()bei primitiven Werten nichtfalse, sondern löst einen Fehler aus. Ist die Eingabe unsicher, vorher mittypeofprüfen oderObject.isExtensible()verwenden. - Proxy-Invariante: Eine
isExtensible-Trap muss denselben Wert liefern wieReflect.isExtensible(target). Sonst löst die Engine einenTypeErroraus. Deshalb gibt man in der Trap üblicherweise das Ergebnis vonReflect.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.