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增强了对对象模型的控制力度,通过新的对象模型,用户可以控制单独的属性是否允许读取、写入、删除和枚举等,甚至可以控制对象是否允许添加或者删除属性,这样就可以实现密封对象的功能。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。