我有一个类似下面的对象,当在该对象上定义属性root
时,我希望对该属性进行修改,所以我有以下代码:
html = {};
然后我像这样使用Object.defineproperty()
:
Object.defineProperty( html , 'root' , {
set ( val ) {
html.root = `${val} i got the power`
}
});
现在,当我尝试以下操作时:
html.root = 'James !!';
我收到一条错误消息:
未捕获的RangeError:超出了最大调用堆栈大小
为什么我无法通过修改添加此属性root
。
答案 0 :(得分:3)
html.root =
将调用设置器本身,而将调用设置器本身,而...
您不能使用相同名称的setter及其支持字段,而应使用其他字段(例如html._root
)来存储基础值。
答案 1 :(得分:3)
您使用set
方法创建无限循环,因为在内部尝试设置具有相同名称的属性,因此调用了相同的set方法。
您可以使用get
方法来解决此问题,并在set
方法中使用其他一些键名(例如原始键+一些前缀_
)。
const html = {};
Object.defineProperty(html, 'root', {
set(val) {
html._root = `${val} i got the power`
},
get() {
return html._root
}
});
html.root = 'James !!';
console.log(html.root)