Javascript знать, когда значение объекта изменяется - PullRequest
3 голосов
/ 28 марта 2019

Для любой переменной или ее свойства, есть ли способ узнать, когда ее значение установлено?

Например, скажем, у меня есть:

let x = { 'a': 1, 'b': 2 };
// x.a's set operation is linked to a method
x.a = 3; // the method is automatically called

Есть ли способ, которым я могувызывать функцию при изменении значения а?Много кода будет изменять это значение;Я не хочу добавлять вызов метода повсеместно.

Мне известны прокси, но для их использования, похоже, требуется отдельная переменная.Это означает, что x не может быть прокси-сервером самого себя.

Предпочтительно, чтобы этот метод работал с примитивами и не примитивами.

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

х не может быть прокси-сервером

Конечно, можно. Вы можете изменить переменную так, чтобы она указывала на прокси, просто набрав

x = new Proxy(x, handler)

Примитивный пример:

const handler = {
  set: function(obj, prop, value) {
    console.log('setting prop: ', prop, ' to ', value)
    obj[prop] = value;
    return true;
  }
};

let x = { 'a': 1, 'b': 2 };

x = new Proxy(x, handler);

x.a = 3; // the method is automatically called
3 голосов
/ 28 марта 2019

Если честно, используйте прокси, если можете

Если вы действительно не можете использовать прокси, вы можете добиться этого, используя сеттеры и геттеры

Хотя этоозначает повторное объявление вашего исходного объекта x, я предполагаю, что он объявлен встроенным, как Минимальный, Полный и Проверяемый пример в вашем вопросе

let x = {
  _a: 1,
  _b: 2,
  get a() {
    return this._a;
  },
  get b() {
    return this._b;
  },
  set a(value) {
    console.log(`changing a from ${this._a} to ${value}`);
    this._a = value;
  },
  set b(value) {
    console.log(`changing b from ${this._b} to ${value}`);
    this._b = value;
  }
};
x.a = 3;
...