使用javascript setter和getter属性来监视更改是个坏主意吗?

时间:2013-12-04 23:22:39

标签: javascript angularjs javascript-events ember.js jasmine

使用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这样的双向绑定框架呢,他们会使用这个功能吗? 那么单元测试呢?

在不使用显式设置器和getter的情况下,观察触发事件更改的事实标准方法是什么?

1 个答案:

答案 0 :(得分:1)

有三种方法可以观察JavaScript对象的变化:

  1. 方法(例如您的设置/获取或组合)
  2. 使用计时器轮询来检查财产
  3. 处理由浏览器内部处理的属性的观察者
  4. 方法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;
    }
    

    干净而直接。

    如果要使用属性,则需要使用定时器进行轮询,或者可以使用对象观察器。

    然而,目前对Object观察者的支持并不是那么好(我上次检查过)。 Chrome有支持,Firefox有自己的观察系统等等,所以如果你使用那些,你需要准备你的代码来处理不受支持的情况。这基本上意味着您需要进行轮询。因此,使用set / get等方法是一种更好的方法IMO。

    观察者对属性很有用。它允许您以这种方式设置属性:

    myObject.value = 10;
    

    并触发一个允许您处理该更改的回调。请注意,它将触发任何属性更改的回调,因此需要迭代事件。

    例如:

    Object.observe(myObject, observerCallback);
    
    function observerCallback(records) {
        records.forEach(checkRecord);
    }
    
    function checkRecord(rec) {
    
        switch(rec.name) {
    
            case 'value':
                handleValueChange();
                break;
        }
    }