TypeError: 无法定义属性 "x": "obj" 不可扩展

JavaScript 异常“无法定义属性“x”:”obj“不可扩展”发生在当 Object.preventExtensions() 将对象标记为不可扩展时,因此它永远不会具有超出其在被标记为不可扩展时所具有的属性。

消息

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)

错误类型

哪里出错了?

通常,对象是可扩展的,可以向其中添加新属性。但是,在本例中,Object.preventExtensions() 将对象标记为不可扩展,因此它永远不会具有超出其在被标记为不可扩展时所具有的属性。

示例

向不可扩展的对象添加新属性

严格模式 中,尝试向不可扩展的对象添加新属性会抛出 TypeError。在宽松模式下,将“x”属性添加会静默地被忽略。

js
"use strict";

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

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

严格模式 和宽松模式中,调用 Object.defineProperty() 在向不可扩展的对象添加新属性时会抛出异常。

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

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

要修复此错误,您需要删除对 Object.preventExtensions() 的调用,或者将其移动到一个位置,以便该属性被更早地添加,并且只有在以后对象被标记为不可扩展。当然,您也可以删除尝试添加的属性,如果您不需要它。

js
"use strict";

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

Object.preventExtensions(obj);

另请参见