javascript 面向對象版塊之定義多個對象屬性以及讀取屬性特性

這是 javascript 面向對象版塊的第三篇文章,主要講解的是多個屬性的定義以及讀取屬性的特性。前面這幾章內容目的在於加深對對象的理解,這樣能夠利於理解後面的原型鏈以及繼承方面的知識,或者你也能夠了解一下不同的 javascript 對象屬性的定義。javascript

定義多個屬性

在上一篇博客中已經講解了定義一個屬性的方法,那就是 Object.defineProperty,那麼在平常開發中若是要定義多個屬性呢,該使用什麼樣的方法,其實能夠聯想到使用 Object.defineProperties,對,就是這個方法,ECMAScript 5 定義了 Object.defineProperties() 方法,利用這個方法能夠經過描述符一次定義多個屬性。這個方法接收兩個對象參數:第一個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應。例如:java

var book = {};
Object.defineProperties(book, {
  _year: {
    value: 2017
  },
  edition: {
    value: 1,
    writable: true,
  },
  year: {
    get: function () {
      return this._year;
    },
    set: function (newVal) {
      if (newVal > this._year) {
        this.edition += newVal - this._year;
      }
    }
  }
})
book.year = 2018;
console.log(book.edition); // 2

以上代碼在 book 對象上定義了兩個數據屬性( _year 和 edition )和一個訪問器屬性( year ),這裏的屬性都是在同一時間建立的。git

同樣的,在調用 Object.defineProperties() 方法時,若是不指定, configurable 、 enumerable 和writable 特性的默認值都是 false 。

讀取屬性的特性

對於讀取屬性的特性能夠使用 Object.getOwnPropertyDescriptor()方法,這個方法接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱。返回值是一個對象,若是是訪問器屬性,這個對象的屬性有 configurable 、 enumerable 、 get 和 set ;若是是數據屬性,這個對象的屬性有 configurable 、 enumerable 、 writable 和 value 。例如:github

var book = {};
Object.defineProperties(book, {
  _year: {
    value: 2017
  },
  edition: {
    value: 1,
    writable: true,
  },
  year: {
    get: function () {
      return this._year;
    },
    set: function (newVal) {
      if (newVal > this._year) {
        this.edition += newVal - this._year;
      }
    }
  }
})

var descriptor1 = Object.getOwnPropertyDescriptor(book, '_year');
console.log(descriptor1.value); // 2017
console.log(descriptor1.configurable); // false
console.log(typeof descriptor1.get); // undefined

var descriptor2 = Object.getOwnPropertyDescriptor(book, 'edition');
console.log(descriptor2.value); // 1
console.log(descriptor2.configurable); // false
console.log(descriptor2.writable); // true

var descriptor3 = Object.getOwnPropertyDescriptor(book, 'year');
console.log(typeof descriptor3.value); // undefined
console.log(descriptor3.enumerable); // false
console.log(typeof descriptor3.get); // function
console.log(typeof descriptor3.set); // function

對於數據屬性 _year , value 等於最初的值, configurable 是 false ,而 get 等於 undefined 。對於訪問器屬性 year , value 等於 undefined , enumerable 是 false ,而 get 是一個指向 getter 函數的指針。segmentfault

小結

這篇文章主要講解了定義多個屬性讀取屬性的特性,分別使用了 Object.defineProperties()Object.getOwnPropertyDescriptor()方法,瞭解了這種定義屬性和讀取屬性的方法以後,相信你對於對象會有更加深入地理解。函數

上一篇:javascript 面向對象版塊之對象屬性this

下一篇:javascript 面向對象版塊之建立對象 指針

相關文章
相關標籤/搜索