对象常量
- 结合
writable: false
和configurable: 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