Переход от Object.observe

Я использую Object.observe() как часть проекта nw.js, который сейчас переходит от nw.js v.0.12.3 к последней версии.

У меня есть такой код:

..(myclass)..
data: { a:0, b:42 },
setupHandlers: function () {
    Object.observe(this.data, changes => this.draw());
},
draw: function () { .. }

Мое первоначальное преобразование выглядит так:

data: {_a: 0, _b: 42},
get a() { return this._a; }
set a(val) { this.data._a = val; this.draw(); } 
get b() { return this._b; }
set b(val) { this.data._b = val; this.draw(); } 

а затем меняйте каждое место, в которое были записаны данные (myobj.data.a = 1вместо того, чтобы писать в объект (myobj.a = 1), таким образом, используя сеттер.

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

1 ответ

Решение

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

const shallow_observer = function (obj, fn) {
    return new Proxy(obj, {
        set(target, name, val) {
            target[name] = val;
            if (fn) fn(target, name, val);
            return true;
        }
    });
};

что позволило нам сделать:

data: { a:0, b:42 },
setupHandlers: function () {
    this.data = shallow_observer(this.data, (data, field, value) => this.draw());
},
draw: function () { .. }

У нас есть deep_observer функция (которая гораздо сложнее), которая обнаруживает изменения во вложенной структуре данных, но shallow_observer было достаточно для всех наших сценариев использования.

Другие вопросы по тегам