Object.preventExtensions()

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.preventExtensions() verhindert, dass einem Objekt jemals neue Eigenschaften hinzugefügt werden (d.h. es verhindert zukünftige Erweiterungen des Objekts). Sie verhindert auch, dass das Prototyp des Objekts neu zugewiesen wird.

Probieren Sie es aus

const object1 = {};

Object.preventExtensions(object1);

try {
  Object.defineProperty(object1, "property1", {
    value: 42,
  });
} catch (e) {
  console.log(e);
  // Expected output: TypeError: Cannot define property property1, object is not extensible
}

Syntax

js
Object.preventExtensions(obj)

Parameter

obj

Das Objekt, das nicht erweiterbar gemacht werden soll.

Rückgabewert

Das Objekt, das nicht erweiterbar gemacht wird.

Beschreibung

Ein Objekt ist erweiterbar, wenn ihm neue Eigenschaften hinzugefügt werden können. Object.preventExtensions() markiert ein Objekt als nicht mehr erweiterbar, sodass es niemals Eigenschaften über diejenigen hinaus haben wird, die es zum Zeitpunkt der Markierung als nicht erweiterbar hatte. Beachten Sie, dass die Eigenschaften eines nicht erweiterbaren Objekts im Allgemeinen immer noch gelöscht werden können. Der Versuch, einem nicht erweiterbaren Objekt neue Eigenschaften hinzuzufügen, schlägt fehl, entweder stillschweigend oder, im Strict-Modus, wird ein TypeError ausgelöst.

Im Gegensatz zu Object.seal() und Object.freeze() ruft Object.preventExtensions() ein intrinsisches JavaScript-Verhalten hervor und kann nicht durch eine Komposition mehrerer anderer Operationen ersetzt werden. Es hat auch sein Reflect-Gegenstück (das nur für intrinsische Operationen existiert), Reflect.preventExtensions().

Object.preventExtensions() verhindert nur die Hinzufügung eigener Eigenschaften. Eigenschaften können immer noch zum Prototyp des Objekts hinzugefügt werden.

Diese Methode macht das [[Prototype]] des Ziels unveränderlich; jede [[Prototype]]-Neuzuweisung wird einen TypeError auslösen. Dieses Verhalten ist spezifisch für die interne [[Prototype]]-Eigenschaft; andere Eigenschaften des Zielobjekts bleiben veränderlich.

Es gibt keine Möglichkeit, ein Objekt wieder erweiterbar zu machen, nachdem es als nicht erweiterbar markiert wurde.

Beispiele

Verwendung von Object.preventExtensions

js
// Object.preventExtensions returns the object
// being made non-extensible.
const obj = {};
const obj2 = Object.preventExtensions(obj);
obj === obj2; // true

// Objects are extensible by default.
const empty = {};
Object.isExtensible(empty); // true

// They can be made un-extensible
Object.preventExtensions(empty);
Object.isExtensible(empty); // false

// Object.defineProperty throws when adding
// a new property to a non-extensible object.
const nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, "new", {
  value: 8675309,
}); // throws a TypeError

// In strict mode, attempting to add new properties
// to a non-extensible object throws a TypeError.
function fail() {
  "use strict";
  // throws a TypeError
  nonExtensible.newProperty = "FAIL";
}
fail();

Der Prototyp eines nicht erweiterbaren Objekts ist unveränderlich:

js
const fixed = Object.preventExtensions({});
// throws a 'TypeError'.
fixed.__proto__ = { oh: "hai" };

Nicht-Objekt-Argument

In ES5 wird, wenn das Argument dieser Methode kein Objekt (ein Primitive) ist, ein TypeError verursacht. In ES2015 wird ein Nicht-Objekt-Argument unverändert zurückgegeben, da Primitive per Definition bereits unveränderlich sind.

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

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

Spezifikationen

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

Browser-Kompatibilität

Siehe auch