要修改屬性默認的特性,必須使用ECAMScript 5的 Object.defineProperty() 方法。
例如:函數
var person = {}; Object.defineProperty( person,'name',{ writable:false, value:'tom' } ); console.log(person.name);//tom person.name = 'join'; console.log(person.name);//tom
這個例子建立了一個名爲name的屬性,他的值爲tom是隻讀的。這個屬性的值是不能夠修改的,若是嘗試爲他指定新值,在非嚴格模式下,賦值操做將被忽略,在嚴格模式下,賦值操做將會致使拋出錯誤。
相似的規則也適用於不可配置的屬性。例如:this
var person = {}; Object.defineRroperty(person,'name',{ configurable:false, value:'tom' }); console.log(perso.name);//tom delete person.name;//false console.log(person.name);//tom
能夠屢次調用Object.defineProperty()方法修改同一個屬性,可是把configurable特性設置爲false以後就會有限制spa
調用這個方法的時候,若是不指定,configurable、enumerable 和writable特性的默認值都是falsecode
訪問器屬性
訪問器屬性不包含數據值
他們包含一對getter和setter函數(不過,這兩個函數都不是必須的)
在讀取訪問器屬性的時候,會調用getter函數,這個函數複製返回有效的值。
在寫入訪問器屬性的時候,會調用setter函數,並傳入新值,這個函數負責決定如何處理數據。
訪問器屬性有以下四個特性
configurable
表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成數據屬性。
直接在對象時定義的屬性,這個特性的默認值爲true
enumerable
保溼可否經過for-in循環返回屬性。
直接在對象上定義的屬性,這個特性的默認值爲true
get
在讀取屬性時調用的函數
默認值爲undefined
set
在寫入屬性時調用的函數
默認值爲undefined
訪問器屬性不能直接定義。必須使用 Object.defineProperty()來定義。
例子:對象
var book = { _year:2004, edition:1 } Object.defineProperty(book,'year',{ get: function(){ return this._year; }, set: function(newValue){ if(newValue >2004){ this._year = newValue; this.edition += newValue-2004 } } }); book.year = 2005; console.log(book.edition);// 2