這是 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 面向對象版塊之建立對象 指針