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