JavaScript Object.freeze() 方法

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()
添加属性 读取属性 修改属性 删除属性
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

上一篇: Object.fromEntries()

下一篇: Object.seal()

给站长反馈

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

邮箱:lvyenet@vip.qq.com

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