一、數據屬性
數據屬性包含一個數據值的位置。這個位置能夠讀取和寫入值。數據屬性有4個描述其行爲的特性。
[ [ Configurable ] ] 表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成訪問屬性。默認爲true
[ [ Enumerable] ] 表示可否經過for-in循環返回屬性。默認爲true
[ [ Writable ] ] 表示可否修改屬性的值。默認爲true
[ [ Value ] ] 包含這個屬性的屬性值。讀取屬性的時候,從這個位置讀取,寫入屬性的時候,把新值保存在這個位置。默認爲undefined
eg:函數
var p = {}; Object.defineProperty(p, "name", { writable: false, value: 'nihao' })
二、訪問器屬性
訪問器屬性不包含數據值,他們包含一對兒getter和setter函數(不過,這兩個函數都不是必須的)在讀取訪問器屬性的時候會調用getter函數,這個函數負責返回有效的值。在寫入訪問器屬性是,會調用setter函數並傳入新值,這個函數負責決定如何處理數據
[ [ Configurable ] ] 表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成訪問屬性。默認爲true
[ [ Enumerable] ] 表示可否經過for-in循環返回屬性。默認爲true
[ [ Get ] ] 在讀取屬性時調用的函數,默認爲undefined
[ [ Set ] ] 在寫入屬性時調用的函數,默認爲undefined
eg:this
var p = {get: 0}; Object.defineProperty(p, "name", { get: function (){ console.log('get'); return this.get; }, set: function (newVal) { console.log('set'); this.get = newVal; } })
三、讀取屬性的特性
Object.getOwnPropertyDescriptor(屬性所在的對象, 屬性名稱);
返回值是一個對象,訪問屬性configurable 、enumerable、get、set四個屬性,
若是是數值屬性,返回的對象屬性有configurable 、enumerable、writable、value四個屬性
備註:
Object.defineProperties()函數能夠定義多個屬性
eg:code
var p = {get: 0}; Object.defineProperties(p, {"name", { get: function (){ console.log('get'); return this.get; }, set: function (newVal) { console.log('set'); this.get = newVal; } }, "age": { writable: true, value: 11 } })