密封对象不能创建或者访问该类原来未声明或定义的属性或方法。
在默认情况下,javascript创建的对象都是动态对象,即允许在运行时为该类添加其他属性和方法
例如:
function Person(myName,myAge){ this.nickName=myName; this.age=myAge; } Person.prototype.showInfo=function(){ return ("海!我的名字是:"+this.nickName+",我现在"+this.age+"岁了。"); } document.write(showInfo()); //这时用户可以添加属性和方法 var tom=new Person("Tom",22); tom.hairColor="red";//添加一个新属性,表示Tom头发的颜色并为属性赋值
使用ECMAScript5增强的对象模型,就可以定义密封对象,它通过Object类的几个静态方法来实现。
Object.preventExtensions(obj);
Object.seal(obj);
Object.freeze(obj);
(一)、密封对象不允许添加成员
使用Object.preventExtensions()方法可以锁定一个对象,防止未来对该对象添加新的成员(但任然可以删除)。同时提供了Object.isExtensible()方法用于检测是否可以增加成员,也就是检测是否使用了Object.preventExtensions()方法,如果可以增加返回true,否则返回false。
例如下面的代码,声明了一个Person类,并且声明了两个属性和方法,然后密封该类的原型对象。
function Person(myName,myAge){ this.nickName=myName; this.age=myAge; } Person.prototype.showInfo=function(){ return ("海!我的名字是"+this.nickName+",我现在"+this.age+"岁了!"); } alert(Object.isExtensible(Person.prototype));//返回true Object.preventExtensions(Person.prototype); alert(Object.isExtensible(Person.prototype));//返回false
现在类的属性只能删除,不能添加了,但是类的实例任然是动态的,可以添加和删除。
用户也可以密封类的实例,但是该模式只有在支持严格模式下的FireFox4浏览器下会抛出异常,其他几个浏览器尚不支持该模式!
(二)、密封对象不允许添加和删除成员
使用Object.seal()方法可以密封一个对象,防止其他代码删除、改变对象的属性和描述符,也阻止添加新成员。同时也提供了Object.isSealed()方法检测是否应用了Object.seal()方法,如果可以添加或删除成员就返回false,否则返回true。
相对于Object.preventExtensions()方法,该方法增强了一步,除了不允许添加以为,还不允许删除。
例:
function Person(myName,myAge){ this.nickName=myName; this.age=myAge; } Person.prototype.showInfo=function(){ return ("海!我的名字是"+this.nickName+",我现在"+this.age+"岁了!"); } alert(Object.isSealed(Person.prototype));//返回false Object.seal(Person.prototype); alert(Object.isSealed(Person.prototype));//返回true
现在类的属性和方法不能删除,也不能添加。但是该类的实例任是动态,可以删除和添加。同上一样,也可密封类的实例。
(三)、完全密封对象
使用Object.freeze()方法可以完全密封一个对象,防止其他代码删除、改变对象的属性和描述符,也阻止增加新的属性。与Object.seal()不同的是,Object.freeze()方法使所有现存的方法都不可写,即变为了只读属性,因此该方法是锁定了一个对象。同时也提供了Object.isFrozen()方法来检测是否使用了Object.freeze()方法,如果锁定了就返回true,否则返回false。
例如:
function Person(myName,myAge){ this.nickName=myName; this.age=myAge; } Person.prototype.showInfo=function(){ return ("海!我的名字是"+this.nickName+",我现在"+this.age+"岁了!"); } alert(Object.isFrozen(Person.prototype));//返回false Object.freeze(Person.prototype); alert(Object.isFrozen(Person.prototype));//返回true
现在,类的属性和方法既不能删除也不能添加,但是该类的实例任是动态,可添加和删除。
注意:javascript仅密封类的实例而不是密封类。
密封对象方法的总结:
方法 | 对象是否密封 | configurable是否设置为false | writable是否设置为false |
Object.preventExtensions() | Yes | ||
Object.seal() | Yes | Yes | |
Object.freeze() | Yes | Yse | Yes |
原文:http://www.cnblogs.com/flase/p/3616791.html