ember.js 使用Javascript setters和getter属性来监视更改是个坏主意吗?

4smxwvx5  于 2022-11-23  发布在  Java
关注(0)|答案(1)|浏览(154)

使用Object.create可以在Javascript中定义setter和getter方法。

o = Object.create(Object.prototype, {

  fooBar: {
    get: function() { return "Meh" },
    set: function(value) { console.log(value) }
  }
});

console.log(o)将始终返回Meh,而执行o = "Heyo"只会直接输出新值,而不会更改o
有没有什么理由不应该使用或者依赖这个行为来触发事件?像angular和ember这样的双向绑定框架会不会利用这个特性?单元测试会不会?
在不使用显式setter和getter的情况下,观察触发事件变化的实际标准方法是什么?

fdbelqdn

fdbelqdn1#

有三种方法可以观察JavaScript对象中的更改:
1.方法(例如set/get或组合)
1.使用计时器轮询以检查属性
1.处理由浏览器内部处理的属性的观察器
方法1很常见也很简单。如果你想使用setter/getter,你可以自己决定。也可以选择将它们组合使用:

var someValue = 0;

this.myMethod = function(newValue) {

    if (arguments.length === 0) return someValue; /// gets if no arg is given
    someValue = newValue;                         /// sets if arg is given 

    return this;
}

很干净很直接。
如果要使用属性,则需要使用计时器进行轮询,或者使用对象观察器。
然而,目前对对象观察器的支持不是很好(上次我检查过)。Chrome有支持,Firefox有自己的观察器系统等等,所以如果你使用这些,你需要准备你的代码来处理不支持它的情况。这基本上意味着你需要轮询代替。因此,方法与设置/获取等是一个更好的方法IMO。
观察器对于属性非常有用。它允许您以如下方式设置属性:

myObject.value = 10;

并触发一个回调函数来处理这个变化。注意,它将在任何属性变化时触发回调函数,因此需要迭代这些事件。
例如:

Object.observe(myObject, observerCallback);

function observerCallback(records) {
    records.forEach(checkRecord);
}

function checkRecord(rec) {

    switch(rec.name) {

        case 'value':
            handleValueChange();
            break;
    }
}

相关问题