JavaScript Object.preventExtensions() 方法

Object.preventExtensions() 语法

Object.preventExtensions() 是 JavaScript 的一个静态方法,它用于将任意对象转换为一个不可扩展的对象(即无法为其添加新属性)。

Object.preventExtensions() 方法不仅可以防止新属性被添加到对象中,还可以防止对象的原型(prototype)被重新指定。

语法:

Object.preventExtensions(obj)

说明:

Object.preventExtensions() 方法接收单个参数。

  • obj(必选):是一个对象。

Object.preventExtensions() 方法是有返回值的,也就是返回原对象(只是该对象已经被变为不可扩展)。

Object.preventExtensions() 具有以下特性。

  • 浅限制性:Object.preventExtensions() 实现的是 “浅限制”,它只影响对象自身。如果对象包含其他对象(如数组或嵌套对象),这些嵌套对象本身仍然是可扩展的。
  • 不可逆性:一旦一个对象被设置为不可扩展,就不能再使其可扩展了。
  • 可扩展性:Object.preventExtensions() 方法会将对象的内部 [[Extensible]] 特性设置为 false。你可以使用 Object.isExtensible() 方法来判断一个对象是否是可扩展的。

提示:

Object.preventExtensions() 摘要

属于 JavaScript Object 对象
使用频率
官方文档 查看
MDN 查看

Object.preventExtensions() 示例

接下来,我们通过几个简单的例子来讲解一下 Object.preventExtensions() 方法是如何使用的。

示例 1:Object.preventExtensions() 基本用法

"use strict";

const obj = {};
Object.preventExtensions(obj);
obj.name = "Jack";

console.log(obj);

运行结果如下。

(报错)TypeError: Cannot add property name, object is not extensible

分析:

Object.preventExtensions() 方法会将一个对象转换为不可扩展对象,如果尝试为不可扩展对象添加新属性,则会报错。

注意: 此报错仅在 “严格模式("use strict")”下触发。在非严格模式下,添加属性操作会被忽略,但不会抛出异常。

示例 2:Object.preventExtensions() 的返回值

const obj = {};
const result = Object.preventExtensions(obj);
console.log(obj === result);

运行结果如下。

true

分析:

Object.preventExtensions() 方法的返回值是原对象本身,只不过经过 Object.preventExtensions() 方法处理后的对象已经是不可扩展的。

Object.preventExtensions() 方法会作用于原对象,因此一般情况下我们不需要使用其返回值,比如:

// 推荐
const obj = {};
Object.preventExtensions(obj);
obj.name = "Jack";
console.log(obj);

// 不推荐
const obj = {};
const result = Object.preventExtensions(obj);
result.name = "Jack";
console.log(result);

示例 3:使用 Object.isExtensible() 判断对象是否可扩展

const obj = {};
console.log(Object.isExtensible(obj));

Object.preventExtensions(obj);
console.log(Object.isExtensible(obj));

运行结果如下。

true
false

分析:

默认情况下定义的对象是可扩展的,此时 Object.isExtensible(obj) 会返回 true。而 Object.preventExtensions(obj) 会将 obj 转换为一个不可扩展对象,此时 Object.isExtensible(obj) 会返回 false。

Object.freeze()、Object.seal() 和 Object.preventExtensions()

Object.freeze()、Object.seal() 和 Object.preventExtensions() 这 3 个方法非常相似,你可以从下表清楚地看出它们的区别。

Object.freeze()、Object.seal() 和 Object.preventExtensions()
添加属性 读取属性 修改属性 删除属性
Object.freeze() × × ×
Object.seal() × ×
Object.preventExtensions ×

示例 4:Object.freeze()

const obj = { a: 1 };

Object.freeze(obj);
console.log(Object.isFrozen(obj));
console.log(Object.isSealed(obj));
console.log(Object.isExtensible(obj));

运行结果如下。

true
true
false

示例 5:Object.seal()

const obj = { a: 1 };

Object.seal(obj);
console.log(Object.isFrozen(obj));
console.log(Object.isSealed(obj));
console.log(Object.isExtensible(obj));

运行结果如下。

false
true
false

示例 6:Object.preventExtensions()

const obj = { a: 1 };

Object.preventExtensions(obj);
console.log(Object.isFrozen(obj));
console.log(Object.isSealed(obj));
console.log(Object.isExtensible(obj));

运行结果如下。

false
false
false

上一篇: Object.seal()

下一篇: Object.is()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号