参考自:https://segmentfault.com/a/1190000019348510

Object.freeze()对象冻结,是指不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。

对象冻结

  1. var obj = {
  2. prop: function() {},
  3. foo: 'bar'
  4. };
  5. obj.foo='jhon'
  6. console.log(obj.foo) //jhon
  7. Object.freeze(obj);
  8. obj.foo="amy"
  9. console.log(obj.foo)//jhon 冻结了,不能修改对象


数组也可以冻结

  1. var arr = ['试试','不变的']
  2. arr[0]='学习';
  3. console.log(arr[0]) //学习
  4. Object.freeze(arr);
  5. arr[0]='星星';
  6. console.log(arr[0]) //学习 冻结了,不能修改对象

const

使用const声明的对象仅能阻止其重新分配,但是并不能使其声明的对象具有不可变性(能够阻止更改其属性)。

  1. const user = 'Bolaji Ayodeji'
  2. user = 'Joe Nash' //报错Uncaught TypeError
  1. const user = {
  2. first_name: 'bolaji',
  3. last_name: 'ayodeji',
  4. email: 'hi@bolajiayodeji.com',
  5. net_worth: 2000
  6. }
  7. user.last_name = 'Samson';
  8. user.net_worth = 983265975975950;
  9. console.log(user);

尽管我们无法重新分配这个名为 user 的变量,但是我们仍然可以改变其对象本身

Object.freeze()

要禁用对象的任何更改,我们需要使用Object.freeze()。

具有嵌套属性的对象实际上并未冻结

Object.freeze() 只是做了层浅冻结,当遇到具有嵌套属性的对象的时候,我们需要递归Object.freeze() 来冻结具有嵌套属性的对象。

  1. const user = {
  2. first_name: 'bolaji',
  3. last_name: 'ayodeji',
  4. contact: {
  5. email: 'hi@bolajiayodeji.com',
  6. telephone: 08109445504,
  7. }
  8. }
  9. Object.freeze(user);
  10. user.last_name = 'Samson'; //last_name不会改变
  11. user.contact.telephone = 07054394926; //contact.telephone会改变,因为这属于嵌套属性
  12. console.log(user);

Object.freeze()与const的区别

const和 Object.freeze() 并不同, const 是防止变量重新分配,而Object.freeze() 是使对象具有不可变性。