【讀好書第四期】面向對象設計(一)

今天簡單介紹一下對象的屬性相關知識。導圖如下:

image-20200104232716768

屬性

對象的屬性有兩種:數據屬性和訪問器屬性

數據屬性

數據屬性包含一個數據值的位置,可以讀取和寫入。具有一下四個特徵:

  • [[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()

今天的分享就到這裏了。謝謝閱讀。

發佈了167 篇原創文章 · 獲贊 28 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章