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.freeze()、Object.seal()、Object.preventExtensions()、Reflect.preventExtensions() 等方法转换过的对象,都会视为不可扩展。
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 | × | √ | √ | √ |
示例 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