JavaScript默认情况下,你可修改任何可以访问到的对象。但在多人协作开发的项目中,这会造成很大问题。如果你是一个模块或代码库的作者,你可能想锁定一些核心库的某些部分,保证任何人不能有意或无意的修改它们。ECMAScript 5引入了几个方法来防止对对象的修改。
防止扩展,禁止为对象添加属性和方法,但已存在的属性和方法是可以被修改和删除的。不可增加, 可修改 可删除
密封,防止扩展,但禁止删除对象已存在的属性和方法。不可增加, 可修改 不可删除
冻结,禁止修改对象已存在的属性和方法,所有字段都是只读的。不可增加, 不可修改 不可删除
防止扩展用Object.preventExtensions(),Object.isExtensible()方法用来检测对象是否是可扩展的。
判断一个对象是否可扩展,即是否可以给它添加新属性
var Person = {
name: 'liuht'
}
//防止扩展
Object.preventExtensions(Person);
console.log(Object.isExtensible(Person)); // -> false
Person.sex = 1; //严格模式下抛出异常,正常模式下失败无提示
密封对象用Object.seal(),Object.isSealed()方法用来检测对象是否是密封的。
让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值的对象。
var Person = {
name: 'liuht'
}
//密封
Object.seal(Person);
console.log(Object.isSealed(Person)); // -> true
console.log(Object.isExtensible(Person)); // -> false
delete Person.name; //严格模式下抛出异常,正常模式下安静的失败
Person.name = 10; //严格模式下抛出异常,正常模式下安静的失败
console.log(Person.name) //10
冻结对象用Object.freeze()方法,Object.isFrozen()方法用来检测对象是否是冻结的。这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。
var Person = {
name: 'liuht'
}
//冻结对象
Object.freeze(Person);
console.log(Object.isFrozen(Person)); // -> true
console.log(Object.isSealed(Person)); // -> true
console.log(Object.isExtensible(Person)); // -> false
delete Person.name; //严格模式下抛出异常,正常模式下安静的失败
Person.age = 10; //严格模式下抛出异常,正常模式下安静的失败
Person.name = 'new name'; //严格模式下抛出异常,正常模式下安静的失败