ECMAScript5中规定了value、writable、configurable、enumerable、get、st共6个属性描述符,用于完成不一样的功能。函数
下面是一个属性的描述定义:spa
{ value:"属性值", writable:true, configurable:true, enumerable:true }
说明:prototype
vaue:属性值code
writable:定义是否能够改变对象
configurable:定义是否能够删除blog
enumerable:定义是否能够迭代ip
后三个描述符可定义也可不定义,他们的键值都默认为true。字符串
(一)、使用加强的对象模型定义属性get
若是要使用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加强了对对象模型的控制力度,经过新的对象模型,用户能够控制单独的属性是否容许读取、写入、删除和枚举等,甚至能够控制对象是否容许添加或者删除属性,这样就能够实现密封对象的功能。