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加強了對對象模型的控制力度,經過新的對象模型,用戶能夠控制單獨的屬性是否容許讀取、寫入、刪除和枚舉等,甚至能夠控制對象是否容許添加或者刪除屬性,這樣就能夠實現密封對象的功能。

相關文章
相關標籤/搜索