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