Как отследить изменение свойства объекта?

Как повесить прослушку на изменение свойства объекта?

Сначала создаю объект со свойством money = 1000
Вешаю на него сеттер на изменение свойства money. Я так понял именно эта функция выполняется при изменении свойства.
Меняю свойство money и получаю Undefined

function test(some_number) 
{
this.money = some_number;


		
		/// Инструкция - при изменении this.money выполнить следущее
		Object.defineProperty(this, 'money', {
		set: function(num){
		alert( this.money )	 // UNDEFINED
		// SOME_FUNCTION() - далее выполняю функцию												
		}
		});

}

var my_cash = new test(1000); 
/// В какой-то момент времени свойство изменилось
my_cash.money  -= 200;
  • Вопрос задан
  • 2712 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вешаю на него сеттер...

Не-а, не на него. Созданное ранее свойство вы перетёрли вызовом defineProperty, кроме того, вы не определяете геттер - отсюда и undefined.

Можно добавить геттер, само же значение сделать локальной переменной конструктора:

function test(m) {
  let money = m;

  Object.defineProperty(this, 'money', {
    get() {
      return money;
    },
    set(val) {
      alert(`Значение свойства money меняется с ${money} на ${val}`);
      money = val;
    },
  });
}

Или можно воспользоваться Proxy:

function test(m) {
  this.money = m;

  return new Proxy(this, {
    set(target, prop, val) {
      alert(`Значение свойства ${prop} меняется с ${target[prop]} на ${val}`);
      target[prop] = val;
      return true;
    },
  });
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы