/**
*防篡改对象
* 2016-07-14 14:13
*/
/**
*1.不可扩展对象
* 调用了Object.preventExtensions()方法后,就不能给person对象添加新属性和方法了。
* 但是仍然可以修改和删除已有的成员。
* 使用Object.isExtensible()可以确定对象是否可以扩展
*
*/
var person = {name : "tamper-proof"};
alert(Object.isExtensible(person));//true
Object.preventExtensions(person);
alert(Object.isExtensible(person));//false
/**
*在非严格模式下,给对象添加新成员会导致静默失败,因此person.age将是undefined。
* 在严格模式下,尝试给不可扩展的对象添加新成员会导致抛出错误
*
*
*/
//person.age = 24;
//alert(person.age);
/**
*2.密封的对象
* ECMAScript 5 为对象定义的第二个保护级别是密封对象。密封对象不可扩展,而且已有成员的([Configurable])特性将被设置为false。意味着不能删除属性和方法
* 因为不能使用OBject.defineProperty()把数据属性修改为访问属性器,或者相反。属性值是可以修改的。
* 要密封对象,可以使用Object.seal()方法
*
* 使用Object.isSealed()方法可以确定对象是否被密封了。因为被密封的对象不可扩展,所以用Object.isExtensible()检测密封的对象也会返回false
*/
var person1 = {name : "tamper-proof"};
alert(Object.isSealed(person1)); //false
alert(Object.isExtensible(person1)); //true
Object.seal(person1);
alert(Object.isSealed(person1)); //true
alert(Object.isExtensible(person1)); //false
person1.age = 24;
alert(person1.age); //undefined
delete person1.name;
alert(person1.name); //tamper-proof
/**
*3.冻结的对象 -------最严格的反篡改级别
* 冻结的对象既不可以扩展,有是密封的,而且对象数据的属性[[writable]]特性会被设置成false。
* 如果定义set函数,访问器属性仍然是可写的。
* 使用Object.freeze()方法可以用来冻结对象
*
* object.isFrozen()方法用于检测冻结对象
*/
var person2 = {name : "tamper-proof"};
alert(Object.isExtensible(person2)); //true
alert(Object.isSealed(person2)); //false
alert(object.isFrozen(person2)); //false
Object.freeze(person2);
alert(Object.isExtensible(person2)); //false
alert(Object.isSealed(person2)); //true
alert(object.isFrozen(person2)); //true
person2.age = 24;
alert(person2.age); //undefined
delete person2.name;
alert(person2.name); //tamper-proof
person2.name = "tamper";
alert(person2.name); //tamper-proof
js对象的操作
最新推荐文章于 2024-04-07 11:52:45 发布