不可扩展对象
默认情况下,所有对象都是可扩展的,使用Object.preventExtensions()方法可以改变这一行为。
var person = { name: "Hiram" };
Object.preventExtensions(person);
person.age = 29;
alert(person.age); //undefined
虽然不能改对象添加新成员,但仍然可以修改和删除已有的成员,使用Object.isExtensible()方法还可以确定对象是否可以扩展。
密封的对象
ECMAScript 5 为对象定义的第二个保护级别是密封对象(sealed object)。要密封对象,可以使用Object.seal()方法。密封对象不可扩展,而且已有成员的[[Configurable]]特性将被设置为false,意味着不能删除属性和方法。
var person = { name: "Hiram" };
Object.seal(person);
person.age = 29;
alert(person.age); //undefined
delete person.name;
alert(person.name); //"Hiram"
使用Object.isSealed()方法可以确定对象是否被密封了。
冻结的对象
最严格的防篡改级别是冻结对象(frozen object),冻结的对象既不可扩展,又是密封的,而且对象数据属性的[[Writable]]特性会被设置为false。如果定义[[Set]]函数,访问器属性仍然是可写的。ECMAScript 5定义的Object.freeze()方法可以冻结对象。
var person = { name: "Hiram" };
Object.freeze(person);
person.age = 29;
alert(person.age); //undefined
delete person.name;
alert(person.name); //"Hiram"
person.name = "Pierce";
alert(person.name); //"Hiram"
使用Object.isFrozen()方法可以检测冻结对象。