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

Object.isExtensible()

Methode

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

seit JavaScript ES5 (ES2015: Nicht-Objekte liefern false statt Typ Kategorie: method-property

Signatur

Object.isExtensible(obj)

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

Typ
boolean
Beschreibung
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));
true false false false

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);
true Kann "verbose" nicht hinzufügen – Objekt ist nicht erweiterbar. false { debug: true }

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));
false false isExtensible-Trap aufgerufen true

// Wichtig · Fallstricke

  • ES5 vs. ES2015: In ES5 löst ein primitiver Wert als Argument einen TypeError aus. Seit ES2015 wird dafür einfach false zurückgegeben. Anders verhält sich Reflect.isExtensible(): Es wirft bei Nicht-Objekten weiterhin einen TypeError.
  • Nicht erweiterbar ist nicht dasselbe wie eingefroren: false bedeutet nur, dass keine neuen Eigenschaften hinzukommen können. Ob die Eigenschaften zusätzlich versiegelt oder schreibgeschützt sind, prüft man mit Object.isSealed() bzw. Object.isFrozen().
  • Endgültig: Ein nicht erweiterbares Objekt lässt sich nicht wieder erweiterbar machen.
  • Proxy-Invariante: Die Trap isExtensible muss dasselbe Ergebnis liefern wie Object.isExtensible(target). Sonst wird ein TypeError ausgelöst.
  • Die Methode wird in allen modernen Browsern und in Node.js unterstützt (Baseline).