使用此代码时出错了
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 += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition);
警告告诉我错误发生在Object.set [as year] this.year = newValue;
我很困惑为什么设置年份会导致这个错误?
答案 0 :(得分:1)
设置年份属性时,隐式调用set函数。
set函数设置year属性(如果值为> 2004)。
所以:
答案 1 :(得分:0)
以下是导致此错误的事件序列:
year
。year
已设置。year
,所以setter再次运行。为避免这种情况,您需要将实际值存储在对象的单独字段中(例如this._year
),然后让您的getter返回该值。这是一个例子:
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 += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition);
答案 2 :(得分:0)
您正在为year
定义一个getter和一个setter。分配给this.year = newValue;
时,setter会再次调用setter,从而导致无限循环。例如,您需要定义自定义属性_year
,并将年份状态保留在那里:
var book = {
edition: 1
};
Object.defineProperty(book, "_year", {
value: 2004,
enumerable: false, // Hide it when looping the object
writeable: true,
configurable: true
});
Object.defineProperty(book, "year", {
get: function(){
return this.year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
},
enumerable: true, // Show this when looping
configurable: true
});
book.year = 2005;
alert(book.edition);
console.log(Object.keys(book)); // ['edition', 'year']