Signatur
Beschreibung
Object.isExtensible() gibt an, ob ein Objekt erweiterbar ist, ob man ihm also neue Eigenschaften hinzufügen kann. Neu erzeugte Objekte sind standardmäßig erweiterbar. Mit Object.preventExtensions(), Object.seal() oder Object.freeze() wird ein Objekt nicht erweiterbar gemacht. Dieser Schritt lässt sich nicht rückgängig machen.
Wenn ein Objekt nicht erweiterbar ist, heißt das nicht, dass es unveränderlich ist. Vorhandene Eigenschaften lassen sich weiterhin ändern und (außer bei seal/freeze) auch löschen. Außerdem kann der Prototyp eines nicht erweiterbaren Objekts nicht mehr neu gesetzt werden. Neue Eigenschaften, die man dem Prototyp selbst hinzufügt, werden aber trotzdem vererbt.
Die Methode ist nützlich, wenn eine Bibliothek, ein Validierungs- oder Serialisierungswerkzeug vor dem Schreiben prüfen möchte, ob ein Objekt geschützt ist. So vermeidet man stille Fehler im Sloppy Mode oder einen TypeError im Strict Mode. Auf Proxys löst der Aufruf die Trap isExtensible aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $obj Pflicht | any | Das Objekt, das geprüft werden soll. Seit ES2015 sind auch primitive Werte erlaubt; sie gelten als nicht erweiterbar. |
Rückgabewert
true, wenn das Objekt erweiterbar ist, sonst false. Für primitive Werte immer false.Beispiele
Grundverhalten mit preventExtensions, seal und freeze
const normal = { a: 1 };
const gesperrt = Object.preventExtensions({ a: 1 });
const versiegelt = Object.seal({ a: 1 });
const eingefroren = Object.freeze({ a: 1 });
console.log(Object.isExtensible(normal));
console.log(Object.isExtensible(gesperrt));
console.log(Object.isExtensible(versiegelt));
console.log(Object.isExtensible(eingefroren));
Sicheres Hinzufügen einer Eigenschaft
'use strict';
const setzeWennMoeglich = (obj, key, value) => {
if (!(key in obj) && !Object.isExtensible(obj)) {
console.warn(`Kann "${key}" nicht hinzufügen – Objekt ist nicht erweiterbar.`);
return false;
}
obj[key] = value;
return true;
};
const config = Object.preventExtensions({ debug: false });
console.log(setzeWennMoeglich(config, 'debug', true)); // vorhandene Eigenschaft ist änderbar
console.log(setzeWennMoeglich(config, 'verbose', true));
console.log(config);
Primitive Werte und Proxy-Trap
console.log(Object.isExtensible(42));
console.log(Object.isExtensible('Text'));
const ziel = {};
const proxy = new Proxy(ziel, {
isExtensible(t) {
console.log('isExtensible-Trap aufgerufen');
return Reflect.isExtensible(t);
}
});
console.log(Object.isExtensible(proxy));
// Wichtig · Fallstricke
- ES5 vs. ES2015: In ES5 löst ein primitiver Wert als Argument einen
TypeErroraus. Seit ES2015 wird dafür einfachfalsezurückgegeben. Anders verhält sichReflect.isExtensible(): Es wirft bei Nicht-Objekten weiterhin einenTypeError. - Nicht erweiterbar ist nicht dasselbe wie eingefroren:
falsebedeutet nur, dass keine neuen Eigenschaften hinzukommen können. Ob die Eigenschaften zusätzlich versiegelt oder schreibgeschützt sind, prüft man mitObject.isSealed()bzw.Object.isFrozen(). - Endgültig: Ein nicht erweiterbares Objekt lässt sich nicht wieder erweiterbar machen.
- Proxy-Invariante: Die Trap
isExtensiblemuss dasselbe Ergebnis liefern wieObject.isExtensible(target). Sonst wird einTypeErrorausgelöst. - Die Methode wird in allen modernen Browsern und in Node.js unterstützt (Baseline).