tamper-proof 对象
JavaScript的缺点之一就是每个对象都可以被相同执行上下文的代码修改,很容易导致意外覆盖,或则一不小心把native 对象覆盖。
Ecmascript 5提供了 tamper-proof 对象来解决这个问题。一旦一个对象被设为 tamper-proof 对象就无法撤销了。
下面依次介绍:
1、nonextensible对象
默认所有对象都是可拓展的,可以添加属性和方法。通过object.preventExtensions()来禁止拓展
var person = { name: “Nicholas” };
Object.preventExtensions(person);
person.age = 29;
alert(person.age); //undefined
对于原本就存在的属性是不受影响的,可以修改删除,可以通过object.isExtensible()来判断。
var person = { name: “Nicholas” };
alert(Object.isExtensible(person)); //true
Object.preventExtensions(person);
alert(Object.isExtensible(person)); //false
N
sealed对象
对象无法拓展的同时,原有的属性无法删除,可以修改。因为它们的[[configurable]]被设为false,无法把数据属性改为存取器属性,无法使用object.defineProperty()。
var person = { name: “Nicholas” };
Object.seal(person);
person.age = 29;
alert(person.age); //undefined
delete person.name;
alert(person.name); //”Nicholas”
可以用object.isSeal()来检测是否密封了:
var person = { name: “Nicholas” };
alert(Object.isExtensible(person)); //true
alert(Object.isSealed(person)); //false
Object.seal(person);
alert(Object.isExtensible(person)); //false
alert(Object.isSealed(person)); //true
S
frozen对象
这个比以上两种更加严格,原本存在的属性都不能修改了,[[writable]]被设为false。
存取器属性只有set函数定义了的情况下才能改。
var person = { name: “Nicholas” };
Object.freeze(person);
person.age = 29;
alert(person.age); //undefined
delete person.name;
alert(person.name); //”Nicholas”
person.name = ”Greg”;
alert(person.name); //”Nicholas”
可以使用object.isFrozen()来检测:
var person = { name: “Nicholas” };
alert(Object.isExtensible(person)); //true
alert(Object.isSealed(person)); //false
alert(Object.isFrozen(person)); //false
Object.freeze(person);
alert(Object.isExtensible(person)); //false
alert(Object.isSealed(person)); //true
alert(Object.isFrozen(person)); //true