Object.preventExtensions()
讓一個對象變的不可擴(kuò)展系宫,也就是永遠(yuǎn)不能再
添加新的屬性
索昂。返回和傳入的參數(shù)相同
的對象。
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()
封閉一個對象扩借,
阻止添加新屬性
并將所有現(xiàn)有屬性
標(biāo)記為不可配置
椒惨。當(dāng)前屬性
的值只要原來
是可寫
的就可以改變
。返回和傳入的參數(shù)相同
的對象潮罪。
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()
凍結(jié)一個對象康谆。一個被凍結(jié)的對象再也不能被修改;凍結(jié)了一個對象則
不能
向這個對象添加新的屬性
嫉到,不能刪除已有屬性
沃暗,不能修改
該對象已有屬性
的可枚舉性
、可配置性
何恶、可寫性
孽锥,以及不能修改
已有屬性的值
。此外细层,凍結(jié)一個對象后該對象的原型
也不能被修改
惜辑。返回和傳入的參數(shù)相同
的對象。
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
總結(jié)
-
preventExtensions
之后只是不允許添加新屬性, 原有屬性可修改可刪除疫赎; -
seal
之后不允許添加新屬性盛撑, 不允許刪除原有屬性, 是否可修改由原屬性的配置決定捧搞; -
freeze
之后不允許添加新屬性抵卫, 不允許刪除原有屬性, 不允許修改值以及屬性描述符; - 由此可見, 鎖定深度是一層一層遞進(jìn)的胎撇;