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