可以使用 Object.freeze()
方法冻结一个 JavaScript 对象。
冻结对象会阻止对对象的修改,包括添加新属性、删除现有属性以及修改现有属性的值。
使用 Object.freeze()
// 创建一个对象
const person = {
name: "Alice",
age: 25,
};
// 冻结对象
Object.freeze(person);
// 尝试修改对象的属性
person.name = "Bob"; // 不会改变,因为对象已被冻结
person.gender = "female"; // 不会添加,因为对象已被冻结
delete person.age; // 不会删除属性,因为对象已被冻结
console.log(person); // 输出: { name: 'Alice', age: 25 }
Object.freeze()
方法的特性
-
不可变性:
- 对象被冻结后,现有的属性变得不可修改。
- 新属性不能被添加。
- 现有属性不能被删除。
-
嵌套对象:
Object.freeze()
只会冻结对象的第一层。嵌套的对象属性不会被递归冻结。
const person = { name: "Alice", address: { city: "Wonderland", }, }; Object.freeze(person); // 修改嵌套对象的属性不会被阻止 person.address.city = "New Wonderland"; console.log(person.address.city); // 输出: 'New Wonderland'
深度冻结
要完全冻结对象及其所有嵌套属性,可以编写一个递归函数来实现深度冻结:
function deepFreeze(obj) {
// 获取对象的所有属性名
const propNames = Object.getOwnPropertyNames(obj);
// 遍历所有属性
propNames.forEach((name) => {
const value = obj[name];
// 如果属性值是对象,则递归冻结
if (typeof value === "object" && value !== null) {
deepFreeze(value);
}
});
// 冻结对象本身
return Object.freeze(obj);
}
const person = {
name: "Alice",
address: {
city: "Wonderland",
},
};
deepFreeze(person);
// 尝试修改嵌套对象的属性
person.address.city = "New Wonderland"; // 不会改变,因为对象及其嵌套对象已被冻结
console.log(person.address.city); // 输出: 'Wonderland'