你不知道的JS系列 ( 35 ) - 对象不变性

JS 程序中很少需要深不可变性。有些特殊情况可能需要这样做。如果发现需要密封或者冻结所有的对象,那重新思考一下程序的设计,让它能更好地应对对象值的改变。

 

对象常量
结合 writable: false 和 configurable: false 就可以创建一个真正的常量属性,不可修改,重定义或者删除
var myObject = {};
Object.defineProperty(myObject, 'f', {
  value: 42,
  writable: false,
  configurable: false
})

 

禁止扩展

如果想禁止一个对象添加新属性并且保留已有属性,可以使用 Object.preventExtensions(...)
var myObject = { a:2 };
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.b; // undefined
在非严格模式下,创建失败,严格模式下,抛出 TypeError 错误

 

密封
Object.seal(...) = Object.preventExtensions(...) + configurable:false
密封之后不能添加新属性,也不能重新配置或者删除任何现有属性,虽然可以修改属性的值

 

冻结
Object.freeze(...) = Object.seal(...) + writable:false
这个方法是对象上最高级别的不可变性,它会禁止对于对象本身及其任意直接属性的修改,

 

posted @ 2020-03-24 06:28  wzndkj  阅读(194)  评论(0编辑  收藏  举报