TypeError: kann Eigenschaft "x" nicht definieren: "obj" ist nicht erweiterbar

Die JavaScript-Ausnahme "kann Eigenschaft "x" nicht definieren: "obj" ist nicht erweiterbar" tritt auf, wenn Object.preventExtensions() ein Objekt als nicht mehr erweiterbar markiert hat, sodass es nie Eigenschaften über die hinaus haben wird, die es hatte, als es als nicht erweiterbar markiert wurde.

Nachricht

TypeError: Cannot add property x, object is not extensible (V8-based)
TypeError: Cannot define property x, object is not extensible (V8-based)
TypeError: can't define property "x": Object is not extensible (Firefox)
TypeError: Attempting to define property on object that is not extensible. (Safari)

Fehlerart

Was schiefgelaufen ist

Normalerweise ist ein Objekt erweiterbar und es können ihm neue Eigenschaften hinzugefügt werden. In diesem Fall hat jedoch Object.preventExtensions() ein Objekt als nicht mehr erweiterbar markiert, sodass es nie Eigenschaften über die hinaus haben wird, die es hatte, als es als nicht erweiterbar markiert wurde.

Beispiele

Hinzufügen neuer Eigenschaften zu nicht erweiterbaren Objekten

Im Strict Mode führt der Versuch, einem nicht erweiterbaren Objekt neue Eigenschaften hinzuzufügen, zu einem TypeError. Im Sloppy Mode wird das Hinzufügen der Eigenschaft "x" stillschweigend ignoriert.

js
"use strict";

const obj = {};
Object.preventExtensions(obj);

obj.x = "foo";
// TypeError: can't define property "x": Object is not extensible

Sowohl im Strict Mode als auch im Sloppy Mode löst ein Aufruf von Object.defineProperty() einen Fehler aus, wenn eine neue Eigenschaft zu einem nicht erweiterbaren Objekt hinzugefügt wird.

js
const obj = {};
Object.preventExtensions(obj);

Object.defineProperty(obj, "x", { value: "foo" });
// TypeError: can't define property "x": Object is not extensible

Um diesen Fehler zu beheben, müssen Sie entweder den Aufruf von Object.preventExtensions() vollständig entfernen oder ihn so verschieben, dass die Eigenschaft früher hinzugefügt wird und das Objekt erst später als nicht erweiterbar markiert wird. Natürlich können Sie auch die Eigenschaft entfernen, die hinzugefügt werden sollte, wenn Sie sie nicht benötigen.

js
"use strict";

const obj = {};
obj.x = "foo"; // add property first and only then prevent extensions

Object.preventExtensions(obj);

Siehe auch