js属性和描述符

ECMAScript5中规定了value、writable、configurable、enumerable、get、st共6个属性描述符,用于完成不同的功能。

下面是一个属性的描述定义:

{
   value:"属性值",
   writable:true,
   configurable:true,
   enumerable:true
}

说明:

vaue:属性值

writable:定义是否可以改变

configurable:定义是否可以删除

enumerable:定义是否可以迭代

后三个描述符可定义也可不定义,他们的键值都默认为true。

(一)、使用增强的对象模型定义属性

如果要使用ECMAScript5属性描述符定义属性,必须使用静态方法Object.defineProperty(),该方法是用来定义属性的,在定义属性时可以改变描述符的键值。

语法:

Object.defineProperty(obj,prop,desc)

参数说明:

obj:一个对象,如果要为一个类的所有实例定义属性,那么可以将该参数指定为该类的原型对象

prop:一个字符串,用于指定属性名

desc:一个对象,包含了属性的描述

下面演示该方法为Person类定义nickName属性:

function Person(){}
Object.defineProperty(Person.prototype,"nickName",{

               value:"Tom",
               writable:true,
               enumerable:true,
               configurable:true    

});

var Person_1=new Person();
document.write(Person_1.nickName);//输出“Tom”

如果是定义只读属性就可以将writable键的值设成false。

(二)、定义get和set方法

Object.defineProperty()方法还可以定义get和set存取方法,由于get和se存取方法需要一个私有的中间变量,所以需要定义一个自执行的匿名函数来包含Object.defineProperty()方法定义。

下面为类Person定义nickName属性

function Person(){}
(function(){
    var _nickName="Tom";
     Object.defineProperty(Person.prototype,"nickName",{
          get:function(){return _nickName;},
          set:function(value){_nickName=value;}
});
})();

var Person_1=new Person();
alert(Person_1.nickName);//输出Tom
Person_1.nickName="John";
alert(Person_1.nickName);//输出John

这是一个读写属性,如果想定义只读属性,那么不定因set即可,如果想定义只写属性,那么不定义get即可。

(三)、一次定义多个属性

Object.defineProperties()方法可以在一步操作中定义或者修改多个属性。

语法

Object.defineProperties(obj,props)

参数说明:

obj:一个对象,如果要为一个类的所有实例定义属性,那么可以将该参数指定为该类的原型对象

props:一个对象,包含多个属性的定义

下面为Person类定义nickName和age

function Person(){}
Object.defineProperties(Person.prototype,{"nickName":{
    value:"TOM",
    writable:false
},"age":{
    value:22,
    writable:true
}});
var Person_2=new Person();
document.write(Person_2.nickName+"\t"+Person_2.age);//输出TOM   22

ECMAScript5增强了对对象模型的控制力度,通过新的对象模型,用户可以控制单独的属性是否允许读取、写入、删除和枚举等,甚至可以控制对象是否允许添加或者删除属性,这样就可以实现密封对象的功能。

js属性和描述符,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。