参考自:https://segmentfault.com/a/1190000019348510
Object.freeze()对象冻结,是指不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。
对象冻结
var obj = {
prop: function() {},
foo: 'bar'
};
obj.foo='jhon'
console.log(obj.foo) //jhon
Object.freeze(obj);
obj.foo="amy"
console.log(obj.foo)//jhon 冻结了,不能修改对象
数组也可以冻结
var arr = ['试试','不变的']
arr[0]='学习';
console.log(arr[0]) //学习
Object.freeze(arr);
arr[0]='星星';
console.log(arr[0]) //学习 冻结了,不能修改对象
const
使用const声明的对象仅能阻止其重新分配,但是并不能使其声明的对象具有不可变性(能够阻止更改其属性)。
const user = 'Bolaji Ayodeji'
user = 'Joe Nash' //报错Uncaught TypeError
const user = {
first_name: 'bolaji',
last_name: 'ayodeji',
email: 'hi@bolajiayodeji.com',
net_worth: 2000
}
user.last_name = 'Samson';
user.net_worth = 983265975975950;
console.log(user);
尽管我们无法重新分配这个名为 user 的变量,但是我们仍然可以改变其对象本身
Object.freeze()
要禁用对象的任何更改,我们需要使用Object.freeze()。
具有嵌套属性的对象实际上并未冻结
Object.freeze() 只是做了层浅冻结,当遇到具有嵌套属性的对象的时候,我们需要递归Object.freeze() 来冻结具有嵌套属性的对象。
const user = {
first_name: 'bolaji',
last_name: 'ayodeji',
contact: {
email: 'hi@bolajiayodeji.com',
telephone: 08109445504,
}
}
Object.freeze(user);
user.last_name = 'Samson'; //last_name不会改变
user.contact.telephone = 07054394926; //contact.telephone会改变,因为这属于嵌套属性
console.log(user);
Object.freeze()与const的区别
const和 Object.freeze() 并不同, const 是防止变量重新分配,而Object.freeze() 是使对象具有不可变性。