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

Object.isSealed()

Methode

Prüft, ob ein Objekt versiegelt ist, also nicht erweiterbar und alle eigenen Eigenschaften nicht konfigurierbar sind.

seit JavaScript ES5 (ES2015: Nicht-Objekte liefern true statt Type Kategorie: method-property

Signatur

Object.isSealed(obj)

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

Typ
boolean
Beschreibung
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);
true { host: 'localhost', port: 3000 }

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({}));
true false true true false

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
true false

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);
true

// Wichtig · Fallstricke

  • ES5 vs. ES2015: In ES5 warf ein primitiver Wert einen TypeError; seit ES2015 wird true zurü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 isExtensible und getOwnPropertyDescriptor/ownKeys ausgelöst.
  • Wird in allen modernen Browsern und in Node.js unterstützt.