不可扩展对象 Object.preventExtensions
不可添加新属性
let obj = {a:1,b:2}
Object.preventExtensions(obj)
obj.c = 1
obj // {a:1,b:2}
// Object.isExtensible检测是否可扩展
console.log(Object.isExtensible(obj)); // false
密封对象 Object.seal
密封对象不可扩展,而且已有的属性成员[[configurable]]特性将被设置成false(意味着不能删除属性和方法,但是可修改已有属性值)
let obj = {
a: 'a',
b: [1,2]
};
// 密封
Object.seal(obj);
// 删除
delete obj.a // false
// 可以删引用类型的属性
delete obj.b[1] // true.
obj.b // {a: "a", b: [1, empty]}
obj.b[1] // undefined
obj.a = 'c'
obj.a // c
// 查看描述, 可以看到configurable为false
Object.getOwnPropertyDescriptors(obj)
//a: {value: "a", writable: true, enumerable: true, configurable: false}
//b: {value: Array(2), writable: true, enumerable: true, configurable: false}
冻结对象 Object.freeze
最严格的防止篡改级别是冻结对象,冻结的对象既不可以扩展,又是密封的,而且对象数据属性的[[writable]]特性会被设置为false。 如果定义[[Set]]函数,访问器属性仍然是可写的
let obj = {
a: 'a',
b: [1,2]
}
Object.freeze(obj);
// 不可修改
obj.a = 'c'
obj.a // 'a'
// 不可删除
delete obj.a // false
// 不可新增
obj.c = 1
// 查看描述, 可以看到configurable为false, writable也为 false
Object.getOwnPropertyDescriptors(obj)
// a: {value: "a", writable: false, enumerable: true, configurable: false}
// b: {value: Array(2), writable: false, enumerable: true, configurable: false}