Object.preventExtensions()

**Object.preventExtensions()** 静态方法阻止向对象添加新属性(即阻止对象未来的扩展)。它还阻止重新分配对象的原型。

试一试

语法

js
Object.preventExtensions(obj)

参数

obj

应该使其不可扩展的对象。

返回值

正在使其不可扩展的对象。

描述

如果可以向对象添加新属性,则该对象是可扩展的。Object.preventExtensions() 将对象标记为不再可扩展,因此它永远不会拥有在其被标记为不可扩展时所具有的属性之外的属性。请注意,非可扩展对象的属性通常仍然可以被删除。尝试向非可扩展对象添加新属性将失败,或者静默失败,或者在严格模式下抛出TypeError

Object.seal()Object.freeze() 不同,Object.preventExtensions() 调用了内在的 JavaScript 行为,不能用多个其他操作的组合来替换。它也有其Reflect对应项(仅存在于内在操作中),Reflect.preventExtensions()

Object.preventExtensions() 仅阻止添加自己的属性。仍然可以向对象原型添加属性。

此方法使目标的[[Prototype]]不可变;任何[[Prototype]]重新赋值都将抛出TypeError。此行为特定于内部[[Prototype]]属性;目标对象的其它属性将保持可变。

一旦对象被设为不可扩展,就无法再使其可扩展。

示例

使用 Object.preventExtensions

js
// Object.preventExtensions returns the object
// being made non-extensible.
const obj = {};
const obj2 = Object.preventExtensions(obj);
obj === obj2; // true

// Objects are extensible by default.
const empty = {};
Object.isExtensible(empty); // true

// They can be made un-extensible
Object.preventExtensions(empty);
Object.isExtensible(empty); // false

// Object.defineProperty throws when adding
// a new property to a non-extensible object.
const nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, "new", {
  value: 8675309,
}); // throws a TypeError

// In strict mode, attempting to add new properties
// to a non-extensible object throws a TypeError.
function fail() {
  "use strict";
  // throws a TypeError
  nonExtensible.newProperty = "FAIL";
}
fail();

不可扩展对象的原型是不可变的

js
const fixed = Object.preventExtensions({});
// throws a 'TypeError'.
fixed.__proto__ = { oh: "hai" };

非对象参数

在 ES5 中,如果此方法的参数不是对象(原始值),则会导致TypeError。在 ES2015 中,非对象参数将按原样返回,没有任何错误,因为根据定义,原始值已经是不可变的。

js
Object.preventExtensions(1);
// TypeError: 1 is not an object (ES5 code)

Object.preventExtensions(1);
// 1                             (ES2015 code)

规范

规范
ECMAScript 语言规范
# sec-object.preventextensions

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

参见