Уведомление Javascript при изменении массива

#javascript #arrays #setter #getter

#javascript #массивы #установщик #средство получения

Вопрос:

У меня есть кое-что для разработчиков javascript среди нас.

Я получил следующий класс:

 function MyClass(){
    this.__defineSetter__("array", function(val){
        alert("setter called");
        this._array = val;
    });
    this.__defineGetter__("array", function(){
        alert("getter called");
        return this._array;
    });
    this._array = new Array();
};
  

Теперь, что происходит, когда я выполняю

 var a = new MyClass();
a.array[0] = "MyString";
alert(a.array[0]);
  

средство получения вызывается дважды (что нормально), но средство установки никогда не выполняется, поскольку фактическая ссылка на массив не изменяется, меняется только содержимое (я предполагаю ожидаемое поведение).
Однако мне также нужно было бы получать «уведомления» при изменении содержимого массива. Таким образом, вызов

 a.array[0] = "MyString";
  

также должно вызывать вызов установщика (или что-то подобное, важно получать уведомление при изменении содержимого массива.

Кто-нибудь в этом разбирается? Как этого можно достичь?

Ответ №1:

Как мы знаем, alert(a.array[0]); будет запускать только средство получения / установки.array и a.array[0] равно var p = a.array; p[0] , что означает, что вы хотите запустить средство получения / установки p [0], а не только средство получения / установки p . Итак, мы можем изменить наше мнение об этом мышлении:

добавьте getter / setter ко всем элементам p

итак, мы можем сделать это следующим образом:

  • если используется что-то подобное p[6] = 0 , которое запускает функцию получения / установки p , определите, все ли элементы p имеют функцию получения / установки . если нет, добавьте его.
  • если используется что-то подобное p = [2,3,4] , просто сначала установите getter / setter в значение.

и код такой: Jsfiddle