Object.seal()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die statische Methode Object.seal() versiegelt ein Objekt. Das Versiegeln eines Objekts verhindert Erweiterungen und macht bestehende Eigenschaften nicht konfigurierbar. Ein versiegeltes Objekt hat einen festen Satz von Eigenschaften: Neue Eigenschaften können nicht hinzugefügt werden, bestehende Eigenschaften können nicht entfernt werden, ihre Aufzählbarkeit und Konfigurierbarkeit können nicht verändert werden, und ihr Prototyp kann nicht neu zugewiesen werden. Die Werte bestehender Eigenschaften können nach wie vor geändert werden, solange sie beschreibbar sind. seal() gibt dasselbe Objekt zurück, das übergeben wurde.

Probieren Sie es aus

const object1 = {
  property1: 42,
};

Object.seal(object1);
object1.property1 = 33;
console.log(object1.property1);
// Expected output: 33

delete object1.property1; // Cannot delete when sealed
console.log(object1.property1);
// Expected output: 33

Syntax

js
Object.seal(obj)

Parameter

obj

Das zu versiegelnde Objekt.

Rückgabewert

Das versiegelte Objekt.

Beschreibung

Das Versiegeln eines Objekts ist gleichbedeutend mit Verhinderung von Erweiterungen und dem anschließenden Ändern aller bestehenden Eigenschaftsdeskriptoren zu configurable: false. Dies hat zur Folge, dass der Satz von Eigenschaften des Objekts festgelegt ist. Wenn alle Eigenschaften nicht konfigurierbar sind, verhindert dies auch, dass sie von Dateneigenschaften in Zugriffseigenschaften und umgekehrt umgewandelt werden, es verhindert jedoch nicht, dass die Werte der Dateneigenschaften geändert werden. Der Versuch, Eigenschaften in einem versiegelten Objekt zu löschen oder hinzuzufügen, oder eine Dateneigenschaft in eine Zugriffseigenschaft oder umgekehrt zu ändern, wird fehlschlagen, entweder stillschweigend oder indem ein TypeError ausgelöst wird (meistens, aber nicht ausschließlich, wenn im Strict-Modus Code).

Private Elemente sind keine Eigenschaften und haben nicht das Konzept von Eigenschaftsdeskriptoren. Private Elemente können nicht aus dem Objekt hinzugefügt oder entfernt werden, unabhängig davon, ob das Objekt versiegelt ist oder nicht.

Die Prototypenkette bleibt unberührt. Aufgrund der Wirkung der Verhinderung von Erweiterungen kann jedoch [[Prototype]] nicht neu zugewiesen werden.

Im Gegensatz zu Object.freeze() können Objekte, die mit Object.seal() versiegelt sind, ihre bestehenden Eigenschaften ändern, solange sie beschreibbar sind.

Beispiele

Verwendung von Object.seal

js
const obj = {
  prop() {},
  foo: "bar",
};

// New properties may be added, existing properties
// may be changed or removed.
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;

const o = Object.seal(obj);

o === obj; // true
Object.isSealed(obj); // true

// Changing property values on a sealed object
// still works.
obj.foo = "quux";

// But you can't convert data properties to accessors,
// or vice versa.
Object.defineProperty(obj, "foo", {
  get() {
    return "g";
  },
}); // throws a TypeError

// Now any changes, other than to property values,
// will fail.
obj.quaxxor = "the friendly duck";
// silently doesn't add the property
delete obj.foo;
// silently doesn't delete the property

// … and in strict mode such attempts
// will throw TypeErrors.
function fail() {
  "use strict";
  delete obj.foo; // throws a TypeError
  obj.sparky = "arf"; // throws a TypeError
}
fail();

// Attempted additions through
// Object.defineProperty will also throw.
Object.defineProperty(obj, "ohai", {
  value: 17,
}); // throws a TypeError
Object.defineProperty(obj, "foo", {
  value: "eit",
}); // changes existing property value

Nicht-Objekt-Argument

In ES5 führt ein Argument, das keine Objekt (ein Primitive) ist, zu einem TypeError. In ES2015 wird ein Nicht-Objekt-Argument unverändert zurückgegeben, da Primitive per Definition bereits unveränderlich sind.

js
Object.seal(1);
// TypeError: 1 is not an object (ES5 code)

Object.seal(1);
// 1                             (ES2015 code)

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-object.seal

Browser-Kompatibilität

Siehe auch