我一直在阅读有关属性属性(可配置,可写,可枚举)的内容,并且正在寻找有关setter如何与不可写/不可配置属性交互的一些说明。
具体而言,如果使用Object.defineProperty()
定义属性,则默认为configurable: false
和writable: false
。在这种情况下,同一对象中的setter函数是否仍然能够修改属性的值?
这是我正在看的例子:
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
- 来自"针对网络开发人员的专业JavaScript,第3版。" (Nicholas C Zakas)
因此,book.year
的setter部分旨在更新book._year
的值。
但由于book._year
是使用Object.defineProperty
定义的,并且未明确设置为可写或可配置,因此不应该是可修改的?或者同一个对象中的函数(即book.year
)是否被排除在这些限制之外?
值得注意的是,当我在浏览器中运行时,这段代码给了我一些有趣的结果......即:
book.year = 2005
对book.year
或book._year
不执行任何操作
book.year(2005)
会产生TypeError: book.year is not a function
。