任何人对象都可以被同一环境中运行的代码修改。开发人员很可能会意外地修改别人的代码,甚至用不兼容的功能重写原生的代码。ECMAScript解决了这个问题,可以让开发人员防篡改对象。
注意:一旦把对象定义为防篡改,就无法撤销。
1.不可扩展对象:
在默认情况下,所有的对象都是可以扩展的。也就是说,任何时候都可以向对象中添加属性和方法。使Object.prevent
Extensions()方法可以改变这个行为,让你不能再给对象添加属性和方法。
var person={name:"远方"}
Object.preventExtensions(person);
person.age="18";
console.log(person.age);//undefined
console.log(Object.isExtensible(person));//false
在使用Object.preventExtensions()方法后,在非严格模式下,给对象添加新成员会导致静默失败,因此person.age
是undefined。而在严格模式下,尝试给不可扩展的对象添加新成员会导致抛出错误。
虽然不能给对象添加新成员,但已有的成员则不受影响。还可以修改和删除已有的成员。使用Object.isExtensible()方法可以确定对象是否可以扩展。
2.密封的对象
密封的对象不可扩展,也不能删除属性和方法,属性值可以修改。
var person={name:"远方"}
Object.seal(person);
person.age="18";
console.log(person.age);//undefined
delete person.name;
console.log(person.name);//"远方"
console.log(Object.isExtendsible(person));//false
console.log(Object.isSealed(person));//true
这是在非严格模式下的显示,在严格模式下,尝试添加或删除对象都会导致抛出错误。可以使用Object.isSealed()方法确定对象是否被密封。
3.冻结的对象
冻结的对象即不可扩展,又是密封的,而且对象数据属性的[[Writable]]特性会被设置为false。
var person={name:"远方"}
Object.freeze(person);
person.age="18";
console.log(person.age);//undefined
delete person.name;
console.log(person.name);//"远方"
person.name="星星";
console.log(person.name);//"远方"
console.log(Object.isExtendsible(person));//false
console.log(Object.isSealed(person));//true
console.log(Object.isFrozed(person));//true
在严格模式下,同样会抛出错误。