这是 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 面向对象版块之建立对象 指针