Object.freeze()方法可以冻结一个对象
一个被冻结的对象再也不能被修改
- 不能添加新属性
- 不能删除已有属性
- 不能修改已有属性的可枚举性、可配置性、可写性
- 不能修改已有属性的值
- 不能修改原型
Object.freeze()的意义在哪里?
应该就是跟const常量一样,只不过,const声明简单类型的值不能修改,对象却是可以修改的,所以,如果你想禁止一个对象的修改就可以用Object.freeze()
const obj = {
one: 1
}
obj.one = 2;
console.log(obj.one);
const obj2 = Object.freeze({
one: 1
})
obj2.one = 2; // 无法修改,报错
还有一种情况,就是如果这个one是一个对象呢,one依旧可以被修改。
这叫浅冻结
再看一个例子:
const obj1 = { internal: {} } Object.freeze(obj1); obj1.internal.a = 'aValue' console.log(obj1.internal.a); // aValue
对于一个常量对象,整个引用图(直接和间接引用其他对象)只能引用不可变的冻结对象。
冻结的对象被认为是不可变的,因为整个对象中的整个对象状态(对其他对象的值和引用)是固定的。
注意,字符串、数字和布尔总是不可变的,而函数和数组是对象。
要使对象不可变,需要递归冻结每个类型为对象的属性(深冻结)。
function deepFreeze(obj) { // 获取定义在obj上的属性名 var propNames = Object.getOwnPropertyNames(obj); // 在冻结自身之前冻结属性 propNames.forEach(function(name) { var prop = obj[name]; // 如果prop是个对象,冻结它 if (typeof prop == 'object' && prop !== null) deepFreeze(prop); }); return Object.freeze(obj); }