首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Object.observe过渡

从Object.observe过渡
EN

Stack Overflow用户
提问于 2017-04-16 18:59:43
回答 1查看 21关注 0票数 0

我一直使用Object.observe()作为nw.js项目的一部分,该项目现在正在从nw.js v.0.12.3过渡到最新版本。

我有这样的代码:

代码语言:javascript
复制
..(myclass)..
data: { a:0, b:42 },
setupHandlers: function () {
    Object.observe(this.data, changes => this.draw());
},
draw: function () { .. }

我最初的转换如下:

代码语言:javascript
复制
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),从而使用setter。

这是一个非常劳动密集型的转变,有更容易的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-05 11:40:58

最后,我们使用Proxy来捕获属性分配:

代码语言:javascript
复制
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;
        }
    });
};

这使我们得以:

代码语言:javascript
复制
data: { a:0, b:42 },
setupHandlers: function () {
    this.data = shallow_observer(this.data, (data, field, value) => this.draw());
},
draw: function () { .. }

我们也有一个deep_observer函数(这要复杂得多),它可以检测嵌套数据结构中的变化,但是shallow_observer对于我们所有的用例都是足够的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43440931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档