TypeError: can't redefine non-configurable property "x"

當嘗試重新定義一個屬性,但該屬性是不可配置的時候,就會出現 JavaScript 異常“can't redefine non-configurable property”。

訊息

TypeError: Cannot redefine property: "x" (V8-based)
TypeError: can't redefine non-configurable property "x" (Firefox)
TypeError: Attempting to change value of a readonly property. (Safari)

錯誤型別

TypeError

哪裡出錯了?

嘗試重新定義一個屬性,但該屬性是不可配置的。configurable 屬性控制該屬性是否可以從物件中刪除,以及其屬性(writable 除外)是否可以更改。通常,透過物件初始化器建立的物件中的屬性是可配置的。但是,例如,在使用Object.defineProperty()時,屬性預設是不可配置的。

示例

由 Object.defineProperty 建立的不可配置屬性

Object.defineProperty() 會建立不可配置屬性,如果你沒有將其指定為可配置。

js
const obj = Object.create({});
Object.defineProperty(obj, "foo", { value: "bar" });

Object.defineProperty(obj, "foo", { value: "baz" });
// TypeError: can't redefine non-configurable property "foo"

如果你打算稍後在程式碼中重新定義“foo”屬性,你需要將其設定為可配置。

js
const obj = Object.create({});
Object.defineProperty(obj, "foo", { value: "bar", configurable: true });
Object.defineProperty(obj, "foo", { value: "baz", configurable: true });

另見