你不知道的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
这个方法是对象上最高级别的不可变性,它会禁止对于对象本身及其任意直接属性的修改,