ECMAScript物件有兩種屬性,分別為資料屬性和存取器屬性,接下來我們就分別對著兩種屬性進行分析。
1、資料屬性
資料屬性包含一個資料值的位置。這個位置可以讀取和寫入值。資料屬性有4個描述其行為的特性。
[ [ Configurable ] ] 表示能否透過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或能否將屬性修改為存取屬性。預設為true
[ [ Enumerable] ] 表示能否透過for-in循環傳回屬性。預設為true
[ [ Writable ] ] 表示能否修改屬性的值。預設為true
[ [ Value ] ] 包含這個屬性的屬性值。讀取屬性的時候,從這個位置讀取,寫入屬性的時候,把新值存在這個位置。預設為undefined
eg:
var p = {}; Object.defineProperty(p, "name", { writable: false, value: 'nihao' })
2、存取器屬性
存取器屬性不包含資料值,他們包含一對兒getter和setter函數(不過,這兩個函數都不是必須的)在讀取存取器屬性的時候會呼叫getter函數,這個函數負責傳回有效的值。在寫入存取器屬性是,會呼叫setter函數並傳入新值,這個函數負責決定如何處理資料
[ [ Configurable ] ] 表示能否透過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或能否把屬性修改為存取屬性。預設為true
[ [ Enumerable] ] 表示能否透過for-in循環傳回屬性。預設為true
[ [ Get ] ] 讀取屬性時所呼叫的函數,預設為undefined
[ [ Set ] ] 在寫入屬性時所呼叫的函數,預設為undefine#d#eg:在寫入屬性中所調用的函數,預設為undefine#d#eg:: #
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; } })
傳回值是一個對象,存取屬性configurable 、enumerable、get、set四個屬性,
如果是數值屬性,傳回的物件屬性有configurable 、enumerable、writable、value四個屬性
備註:
Object.defineProperties()函數可以定義多個屬性
eg:
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 } })
以上是淺析ECMAScript中物件的兩種屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!