在红宝书第六章开头部分,提到了JavaScript对象的属性分为数据属性和访问器属性,其中有两种定义属性的方法 :Object.defineProperty()
和Object.defineproperties()
,对着书上的代码写了一遍之后,出现了奇怪的结果:
Object.defineProperty()
var book = {
_year: 2014,
edition: 1
};
Object.defineProperty(book,"year",{
get: function() {
return this._year;
},
set: function(newValue){
if (newValue > 2014) {
this._year = newValue;
this.edition += newValue - 2014;
};
}
});
book.year = 2015;
console.log(book.edition); //结果为2
Object.defineProperties
var book = {};
Object.defineProperties(book,{
_year: {
value: 2014
},
edition: {
value: 1
},
year: {
get: function() {
return this._year;
},
set: function(newValue) {
if (newValue > 2014) {
this._year = newValue;
this.edition += newValue - 2014
};
}
}
});
book.year = 2015;
console.log(book.edition); //结果为1
PHPz2017-04-10 17:21:09
第二个使用 Object.getOwnPropertyDescriptor(book, 'edition')
查看下它的属性配置你会发现它的 writable
是 false 的。
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
文档里也详细说明了,writable 的默认值是 false。
高洛峰2017-04-10 17:21:09
嘿嘿,红宝书刚好也看到这个地方了。
你看书不仔细啊,140页下面有一句话:
在调用
Object.defindeProperty()
方法时,如果不指定,configurable
、enumerable
、writable
特性的默认值都是false
。
使用 Object.defindeProperties()
也一样,如果不指定,通过这个方法定义属性的 writable
就会是 false
,不能被修改。
另:如果不使用这个方法来定义属性,那么那三个特性的默认值都为 true
。所以你第一段代码直接定义的 _year
和 edition
是可以被修改的。