Object.freeze() 语法
Object.freeze() 是 JavaScript 的一个静态方法,它用于将一个对象进行 “冻结” 。所谓冻结对象,指的是将一个普通对象转化为一个不可变对象。
如果一个对象被冻结,那么我们就不能为这个对象添加新的属性,不能删除已有属性,也不能修改已有属性的值。
语法:
Object.freeze(obj)说明:
Object.freeze() 方法接收单个参数。
obj(必选):表示你将要冻结的对象。
Object.freeze() 方法具有以下特性。
- 不可逆性:如果一个对象被 Object.freeze() 冻结,它就不能再被 “解冻” 了。
- 浅冻结性:Object.freeze() 实现的是 “浅冻结” ,它只会冻结对象自身的属性。如果对象包含其他对象(如数组或嵌套对象),这些嵌套对象本身并不会被冻结。要实现深冻结,你需要递归地对所有嵌套对象应用 Object.freeze()。
- 可配置性:冻结对象会将所有自身属性的 configurable 特性设置为 false。这意味着你不能删除属性,也不能改变属性的描述符。
- 可写性:冻结对象会将所有自身数据属性的 writable 特性设置为 false。这意味着你不能改变属性的值。
注意:
- freeze() 方法是一个静态方法,它只能被类名(即 Object)调用,而无法被实例调用。
- 我们可以使用 Object.isFrozen() 方法来判断一个对象是否为冻结对象。
Object.freeze() 摘要
| 属于 | JavaScript Object 对象 |
|---|---|
| 使用频率 | 中 |
| 官方文档 | 查看 |
| MDN | 查看 |
Object.freeze() 示例
接下来,我们通过一个简单的例子来讲解一下 Object.freeze() 方法是如何使用的。
示例 1:Object.freeze() 基本用法
const person = {
name: "Jack",
gender: "男"
};
Object.freeze(person);
person.age = 24;
console.log(person);运行结果如下。
{ name: "Jack", gender: "男" }分析:
在这个例子中,由于 person 对象已经被冻结,所以尝试给它添加新属性是无效的。如果我们把 Object.freeze(person); 这一句代码删除,此时输出结果就是:
{ name: "Jack", gender: "男", age: 24 }冻结一个对象非常有用,如果你不希望一个对象被修改,那么 Object.freeze() 就是一个很好的选择。
Object.freeze()、Object.seal() 和 Object.preventExtensions()
Object.freeze()、Object.seal() 和 Object.preventExtensions() 这 3 个方法非常相似,你可以从下表清楚地看出它们的区别。
| 添加属性 | 读取属性 | 修改属性 | 删除属性 | |
|---|---|---|---|---|
| Object.freeze() | × | √ | × | × |
| Object.seal() | × | √ | √ | × |
| Object.preventExtensions | × | √ | √ | √ |
示例 2: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示例 3: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示例 4: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