Signatur
Beschreibung
Object.isSealed() gibt true zurück, wenn ein Objekt versiegelt ist. Das heißt: Es ist nicht erweiterbar (siehe Object.isExtensible()), und alle eigenen Eigenschaften (auch Symbol-Schlüssel und nicht aufzählbare) sind nicht konfigurierbar. Man kann also keine Eigenschaften hinzufügen oder löschen, beschreibbare Werte lassen sich aber weiterhin ändern.
Typischerweise versiegelt man Objekte mit Object.seal(). Ein Objekt kann aber auch „von Hand“ als versiegelt gelten, etwa wenn ein leeres Objekt mit Object.preventExtensions() nicht erweiterbar gemacht wurde, oder wenn alle Eigenschaften per Object.defineProperty() auf configurable: false gesetzt wurden. Eingefrorene Objekte (Object.freeze()) sind immer auch versiegelt.
Nützlich ist die Methode in defensivem Code, in Tests oder in Bibliotheken, die prüfen müssen, ob sie ein übergebenes Objekt noch um Eigenschaften erweitern oder Eigenschaften daraus entfernen dürfen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $obj Pflicht | any | Das zu prüfende Objekt. Primitive Werte gelten ab ES2015 als versiegelt. |
Rückgabewert
true, wenn das Objekt versiegelt ist (oder ein primitiver Wert übergeben wurde), sonst false.Beispiele
Versiegeltes Objekt prüfen und nutzen
const config = Object.seal({ host: 'localhost', port: 8080 });
console.log(Object.isSealed(config));
config.port = 3000; // erlaubt: Wert ändern
config.debug = true; // ignoriert (im Strict Mode: TypeError)
delete config.host; // ignoriert (im Strict Mode: TypeError)
console.log(config);
Randfälle: leere, eingefrorene und primitive Werte
const leer = Object.preventExtensions({});
console.log(Object.isSealed(leer)); // leer + nicht erweiterbar
const mitProp = Object.preventExtensions({ a: 1 });
console.log(Object.isSealed(mitProp)); // 'a' ist noch konfigurierbar
console.log(Object.isSealed(Object.freeze({ b: 2 })));
console.log(Object.isSealed(42));
console.log(Object.isSealed({}));
Manuell versiegeln über defineProperty
const obj = { id: 7 };
Object.defineProperty(obj, 'id', { configurable: false });
Object.preventExtensions(obj);
console.log(Object.isSealed(obj));
console.log(Object.isFrozen(obj)); // id ist noch beschreibbar
Defensive Prüfung vor dem Erweitern
const addTimestamp = (target) => {
if (Object.isSealed(target)) {
return { ...target, createdAt: Date.now() }; // Kopie statt Mutation
}
target.createdAt = Date.now();
return target;
};
const result = addTimestamp(Object.seal({ name: 'Report' }));
console.log('createdAt' in result);
// Wichtig · Fallstricke
- ES5 vs. ES2015: In ES5 warf ein primitiver Wert einen
TypeError; seit ES2015 wirdtruezurückgegeben, da Primitive ohnehin unveränderlich sind. - Nur flach: Die Prüfung betrifft nur die eigenen Eigenschaften der obersten Ebene. Verschachtelte Objekte können weiterhin erweiterbar sein.
- Versiegelt ≠ eingefroren: Versiegelte Objekte erlauben das Ändern beschreibbarer Werte. Für vollständige Unveränderlichkeit
Object.isFrozen()prüfen. - Ein leeres, nicht erweiterbares Objekt gilt automatisch als versiegelt und eingefroren.
- Verstöße gegen die Versiegelung scheitern im Sloppy Mode stillschweigend, im Strict Mode (auch in Modulen und Klassen) mit
TypeError. - Bei Proxys werden die Traps
isExtensibleundgetOwnPropertyDescriptor/ownKeysausgelöst. - Wird in allen modernen Browsern und in Node.js unterstützt.