ECMAScript 5 对象修改保护功能

 2015年03月18日    70     声明


在JavaScript里,默认情况下,你可修改作何你可以访问到的对象。你可以自由的删除对象的属性或覆盖对象的方法,这在多人协作开发的项目中,会造成很大问题,因为你不知道你的修改会对别人造成什么样的影响。如果你是一个模块或代码库的作者,你可能想锁定一些核心库的某些部分,保证任何人不能有意或无意的修改它们。ECMAScript 5引入了几个方法来防止对对象的修改。


这些方法提供了三种级别的锁定,在Chrome、Firefox4+、Opera12+、IE9+、Safari5.1+的浏览器版本中已经提供对这些功能的支持。三种锁定级别是:

防止扩展,禁止为对象添加属性和方法,但已存在的属性和方法是可以被修改和删除的。

密封,与防止扩展相似,但禁止删除对象已存在的属性和方法。

冻结,禁止修改对象已存在的属性和方法,所有字段都是只读的。

每种锁定都有两个方法, 一个用来执行操作,一个用来检测是否已应用了相应操作。


防止扩展用Object.preventExtensions(),Object.isExtensible()方法用来检测对象是否是可扩展的。示例如下:

var Person = {
  name: 'liuht'
}

//防止扩展
Object.preventExtensions(Person);
console.log(Object.isExtensible(Person)); 		//	-> false
Person.sex = 1; 					//严格模式下抛出异常,正常模式下失败无提示

密封对象用Object.seal(),Object.isSealed()方法用来检测对象是否是密封的,被密封的对象同时也是不可扩展的。示例如下:

var Person = {
  name: 'liuht'
}

//密封
Object.seal(Person);
console.log(Object.isSealed(Person));		// -> true
console.log(Object.isExtensible(Person)); 	//	-> false
delete Person.name;				//严格模式下抛出异常,正常模式下安静的失败
Person.age = 10;				//严格模式下抛出异常,正常模式下安静的失败

冻结对象用Object.freeze()方法,Object.isFrozen()方法用来检测对象是否是冻结的。被冻结的对象同时也是不可扩展的和密封的。示例如下:

var Person = {
  name: 'liuht'
}

//冻结对象
Object.freeze(Person);
console.log(Object.isFrozen(Person));		// -> true
console.log(Object.isSealed(Person));		// -> true
console.log(Object.isExtensible(Person)); 	//	-> false
delete Person.name;				//严格模式下抛出异常,正常模式下安静的失败
Person.age = 10;				//严格模式下抛出异常,正常模式下安静的失败
Person.name = 'new name';		//严格模式下抛出异常,正常模式下安静的失败