所以我有两个"name"作为属性和作为Object.defineProperty()传递的参数。如果我选择将命名约定与我的图书对象以及object . defineproperty()的"name"相同,我将在控制台上得到一个错误调用"堆栈大小超过"。两者的确切区别是什么?这有什么关系呢?
var book ={
year: 2004,
edition : 1
};
Object.defineProperty(book, "year",{
get: function(){
return this.year;
},
set:function(newValue){
if(newValue > 2004){
this.year = newValue;
this.edition = this.edition + newValue -2004;
}
}
});
book.year = 2005;
alert(book.edition);
Thank you
你不可能既拥有属性的getter,又期望以相同的名称引用存储属性。二选一
创建一个无限循环:
Object.defineProperty(book, "year",{
get: function(){
return this.year;
},
...
你实际上是在说任何时候有人请求year
属性,那么它应该使用你的getter函数。在getter函数中,你再次调用getter函数它再次调用getter函数。直到那堆炸药爆炸。语句return this.year
将简单地调用getter函数。
哦,顺便告诉你,你的setter函数也有同样的问题。
如果你想要一个地方存储year
属性值,那么你将不得不使用不同的属性名称或使用某种闭包变量(例如私有实例值)。你不能同时拥有getter和setter以及你实际存储值的名称的属性。二选一
一个简单的解决方案是更改存储实际值的属性值的名称,然后阻止任何代码直接访问该值:
var book ={
_year: 2004,
edition : 1
};
Object.defineProperty(book, "year",{
get: function(){
return this._year;
},
set:function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition = this.edition + newValue -2004;
}
}
});
book.year = 2005;
alert(book.edition);