今天簡單介紹一下對象的屬性相關知識。導圖如下:
屬性
對象的屬性有兩種:數據屬性和訪問器屬性
數據屬性
數據屬性包含一個數據值的位置,可以讀取和寫入。具有一下四個特徵:
- [[Configurable]]:能否刪除屬性或定義屬性 。默認值
true
- [[enumerbale]]:能否通過forin循環返回對象。默認值
true
- [[Writable]]:可否修改屬性值。默認值
true
- [[Value]]:保存的數據值。默認
undefined
問題:如何修改默認的特性?
需要使用Object.defineProperty()
方法。
var person={};
Object.defineProperty(person,"name",{
writable:false,
value:"Nicholas"
})
// 這裏定義了一個name屬性,不可以修改。
「注意」Object.defineProperty()
可以重複的修改同一個屬性。
訪問器屬性
訪問器屬性不包含數據值;它們包含一對兒getter和setter函數(不過,這兩個函數都不是必需的)。
在讀取訪問器屬性時,會調用getter函數,這個函數負責返回有效的值;
在寫入訪問器屬性時,會調用setter函數並傳入新值,這個函數負責決定如何處理數據。
訪問器屬性同樣包含4個特性:
- [[Configurable]]:能否刪除屬性或定義屬性 。默認值
true
- [[enumerbale]]:能否通過forin循環返回對象。默認值
true
- [[Set]]:設置屬性的時候調用的函數。默認值
undefined
- [[Get]]:讀取屬性的時候調用的函數。默認
undefined
這四個屬性也需要Onject.definedProperty
定義。
var book={
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get: function() {
returnthis._year;
},
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
});
book.year=2005;alert(book.edition);//2
以上代碼創建了一個book對象,並給它定義兩個默認的屬性:_year和edition。
其他
同時定義多個屬性Object.defineProperties()
獲取屬性的特性Object.getOwnPropertyDescriptor()
今天的分享就到這裏了。謝謝閱讀。