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

另见