Object 的不变性

对象常量

  • 结合 writable: falseconfigurable: false 就可以创建一个真正的常量属性(不可修改、重定义或者删除)
let obj = {};
Object.defineProperty(obj, "num", {
    value: 20,
    writable: false,
    configurable: false
})
console.log(obj)  //{num: 20}
obj.num = 30;
console.log(obj)  //{num: 20}

禁止扩展

  • 禁止一个对象添加新属性 并且 保留已有属性,可以使用 Object.preventExtensions(obj)
let obj = {
    a: 1
}
Object.preventExtensions(obj);
console.log(obj); // {a: 1}
obj.a = 2;
obj.b = 10;
console.log(obj.a) // 2 ( writable 默认 true )
console.log(obj.b)  // undefined

密封

  • Object.seal(obj) 会创建一个 “密封”的对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions(obj) 并把现有属性标记为 configurable: false
let obj = {
    a: 1
}
Object.seal(obj);
console.log(obj);  // {a: 1}
obj.b = 3;
Object.defineProperty(obj, 'a', {
    value: 2,  //仍然可以修改值(默认可写)
    writable: false //该设置无效
})
console.log(obj) // {a: 2}
obj.a = 4
console.log(obj)  // {a: 4}

冻结

Object.freeze(obj) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal(obj) 并把所有 “数据访问” 属性标记为 writable: false

let obj = {
    a: 1
}
Object.freeze(obj);
console.log(obj);
obj.b = 2;
Object.defineProperty(obj, "a", {
    value: 3,
    writable: true
})  //  TypeError
console.log(obj) // {a: 1}
obj.a = 4;
console.log(obj) // {a: 1}

小结

bu-1.png

你可能感兴趣的:(Object 的不变性)