密封对象

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

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

 

转载于:https://www.cnblogs.com/flase/p/3616791.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值