js属性和描述符

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加强了对对象模型的控制力度,经过新的对象模型,用户能够控制单独的属性是否容许读取、写入、删除和枚举等,甚至能够控制对象是否容许添加或者删除属性,这样就能够实现密封对象的功能。