Функция Object.defineproperty () не работает должным образом, выдана максимальная ошибка стека вызовов - PullRequest
0 голосов
/ 27 июня 2019

У меня есть объект, подобный приведенному ниже, когда для этого объекта определено свойство root, я хочу изменить это свойство, поэтому у меня есть следующий код:

html = {};

, а затем я использую Object.defineproperty() так:

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

Теперь, когда я попробую следующее:

html.root = 'James !!';

Я получаю сообщение об ошибке:

Uncaught RangeError: превышен максимальный размер стека вызовов

Почему я не могу добавить это свойство root с модификацией.

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Вы создаете бесконечный цикл с помощью метода 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)
3 голосов
/ 27 июня 2019

html.root = вызовет сам установщик, который вызовет сам установщик, который ...

Вы не можете иметь сеттер и его вспомогательное поле под одним и тем же именем, используйте другое поле (например, html._root) для хранения базового значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...