Object.defineproperty()设置无法正常工作,抛出最大调用堆栈错误

时间:2019-06-27 12:51:19

标签: javascript object

我有一个类似下面的对象,当在该对象上定义属性root时,我希望对该属性进行修改,所以我有以下代码:

html = {};

然后我像这样使用Object.defineproperty()

Object.defineProperty( html , 'root' , {
    set ( val ) {
      html.root = `${val} i got the power`
    }
});

现在,当我尝试以下操作时:

html.root = 'James !!';

我收到一条错误消息:

  

未捕获的RangeError:超出了最大调用堆栈大小

为什么我无法通过修改添加此属性root

2 个答案:

答案 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)