JS防篡改对象

javascript的共享本质使得其任何对象都可以被在同一环境中运行的代码修改。但是由于一个项目需要多人协作的原因,如果不是总观全局代码,很有可能在开发的过程中一不小心就修改了别人的代码,甚至更悲剧的是,用不兼容的功能重写了原生对象。所以如何防止篡改是一项很重要的工作。

不可扩展对象

默认情况下,所有对象都是可以扩展的,也就是说,任何时候都可以向对象中添加属性和方法。 比如我定义一个对象 var student={name:’liao’} 然后给他添加一个属性 student.score=89; 那么student就有了2个属性。现在,使用Object.preventExtensions()方法可以改变这个行为

var student={name:'liao'};
Object.preventExtensions(student);
student.score=89;
alert(student.score);//undefined

在调用了Object.preventExtensions()方法后,就不能给student对象添加新的属性和方法 了,但是可以修改和删除已有的成员,另外使用Object,isExtentsible()方法还可以确定对象是否可以扩展。

密封对象

密封对象不可扩展,,而且已有成员的[{Configurable}]特性被设置为false,这就意味着不能删除属性和方法,因为不能使用Object.defineProperty()把数据属性修改为访问器属性,或者相反。属性值是可以修改的 要密封对象,可以用Oject.seal():

var person={name:'liao'};
Object.seal(person);
person.age=24;
alert(person.age);//undefined
delete person.name;
alert(person.name);//'liao'

使用Object.isSealed()方法可以确定对象是否被密封了

var person={name:'liao'};
alert(Object.isExtensible(person));//true
alert(Object.isSealed(person));//false
 Object.seal(person);
 alert(Object.isExtensible(person));//false
alert(Object.isSealed(person));//true

冻结对象

最严格的防篡改级别是冻结对象,冻结对象既不可扩展,又是密封的,可以用Object.freeze()方法来冻结对象。

var person={name:'liao'};
Object.freeze(person);
person.age=24;person.age=24;
alert(person.age);//undefined
delete person.name;
alert(person.name);//'liao'

person.name='qian';
alert(person.name);//'liao'

可以用Object.isFrozen()方法来检测冻结动向

var person={name:'liao'};
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