JavaScript 对象冻结
什么是对象冻结?
在JavaScript中,对象是可变的,这意味着我们可以随时添加、删除或修改对象的属性。然而,有时候我们需要防止对象被意外修改,这时就可以使用JavaScript提供的冻结功能。
对象冻结是一种使对象变为不可变的操作,它可以防止对象属性的添加、删除和修改。JavaScript提供了三种不同级别的对象锁定方法,分别是:
Object.preventExtensions()
- 防止添加新属性Object.seal()
- 防止添加和删除属性Object.freeze()
- 防止添加、删除和修改属性(完全冻结)
本文将主要聚焦于最强大的方法 —— Object.freeze()
。
Object.freeze() 方法详解
Object.freeze()
方法可以冻结一个对象,一旦对象被冻结,就无法再对该对象添加新属性、删除已有属性或修改已有属性的值和属性的可配置性、可写性。
基本语法
Object.freeze(obj);
其中,obj
是要被冻结的对象。该方法返回传入的同一个对象,但该对象已经被冻结。
简单示例
让我们看一个简单的例子,了解 Object.freeze()
的效果:
// 创建一个对象
const person = {
name: "张三",
age: 30,
address: {
city: "北京",
district: "朝阳区"
}
};
// 冻结对象
Object.freeze(person);
// 尝试修改属性值(在严格模式下会抛出错误)
person.name = "李四";
// 尝试添加新属性
person.email = "[email protected]";
// 尝试删除属性
delete person.age;
console.log(person);
// 输出: { name: '张三', age: 30, address: { city: '北京', district: '朝阳区' } }
// 可以看到,所有修改操作都被忽略了
备注
在严格模式下('use strict'),尝试修改冻结对象会抛出 TypeError 异常。在非严格模式下,修改操作会被默默地忽略。
检查对象是否被冻结
JavaScript 提供了 Object.isFrozen()
方法来检查一个对象是否被冻结:
const user = { username: "admin" };
console.log(Object.isFrozen(user)); // 输出: false
Object.freeze(user);
console.log(Object.isFrozen(user)); // 输出: true