密封对象

密封对象不能创建或者访问该类原来未声明或定义的属性或方法。

在默认情况下,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

 

posted on 2014-03-21 21:49  false~  阅读(237)  评论(1编辑  收藏  举报

导航