Object.preventExtensions()
让一个对象变的不可扩展,也就是永远不能再
添加新的属性
。返回和传入的参数相同
的对象。
var obj = {};
obj.a = 1;
Object.defineProperty(obj, 'c', {value: 3, configurable: true})
Object.defineProperty(obj, 'd', {value: 4, configurable: true, writable: true})
var obj2 = Object.preventExtensions(obj);
obj === obj2; // true
obj.a = 'a';
obj.b = 2;
obj.c = 'c';
obj.d = 'd'
console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, d
delete obj.a
console.log(obj.a, obj.b, obj.c, obj.d); // undefined, undefined, 3, d
Object.defineProperty(obj, 'c', {writable: true});
obj.c = 'c';
Object.defineProperty(obj, 'd', {writable: false});
obj.d = 4;
console.log(obj.a, obj.b, obj.c, obj.d); // undefined, undefined, c, d
Object.seal()
封闭一个对象,
阻止添加新属性
并将所有现有属性
标记为不可配置
。当前属性
的值只要原来
是可写
的就可以改变
。返回和传入的参数相同
的对象。
var obj = {};
obj.a = 1;
Object.defineProperty(obj, 'c', {value: 3, configurable: true})
Object.defineProperty(obj, 'd', {value: 4, configurable: true, writable: true})
var obj2 = Object.seal(obj);
obj === obj2; // true
obj.a = 'a';
obj.b = 2;
obj.c = 'c';
obj.d = 'd'
console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, d
delete obj.a
console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, d
Object.defineProperty(obj, 'c', {writable: true}); // TypeError
Object.defineProperty(obj, 'd', {writable: false}); // TypeError
Object.freeze()
冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则
不能
向这个对象添加新的属性
,不能删除已有属性
,不能修改
该对象已有属性
的可枚举性
、可配置性
、可写性
,以及不能修改
已有属性的值
。此外,冻结一个对象后该对象的原型
也不能被修改
。返回和传入的参数相同
的对象。
var obj = {};
obj.a = 1;
Object.defineProperty(obj, 'c', {value: 3, configurable: true})
Object.defineProperty(obj, 'd', {value: 4, configurable: true, writable: true})
var obj2 = Object.freeze(obj);
obj === obj2; // true
obj.a = 'a';
obj.b = 2;
obj.c = 'c';
obj.d = 'd'
console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, 4
delete obj.a
console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, 4
Object.defineProperty(obj, 'c', {writable: true}); // TypeError
Object.defineProperty(obj, 'd', {writable: false}); // TypeError
总结
-
preventExtensions
之后只是不允许添加新属性, 原有属性可修改可删除; -
seal
之后不允许添加新属性, 不允许删除原有属性, 是否可修改由原属性的配置决定; -
freeze
之后不允许添加新属性, 不允许删除原有属性, 不允许修改值以及属性描述符; - 由此可见, 锁定深度是一层一层递进的;