Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript setter和getter属性监视更改是一个坏主意吗?_Javascript_Angularjs_Ember.js_Jasmine_Dom Events - Fatal编程技术网

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

使用Javascript setter和getter属性监视更改是一个坏主意吗?,javascript,angularjs,ember.js,jasmine,dom-events,Javascript,Angularjs,Ember.js,Jasmine,Dom Events,使用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”操作将仅直接输出新值,而不会

使用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的情况下,观察触发事件的更改的实际标准方法是什么?

观察JavaScript对象中的更改有三种方法:

  • 方法(例如set/get或组合)
  • 使用计时器轮询以检查属性
  • 观察者处理由浏览器内部处理的属性
  • 方法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有自己的observer系统等等,所以如果您使用这些系统,您需要准备代码来处理不支持它的情况。这基本上意味着你需要投票。因此,set/get等方法是一种较好的方法

    观察者对属性很有用。它将允许您通过以下方式设置属性:

    myObject.value = 10;
    
    并触发一个回调,允许您处理该更改。注意,它将在任何属性更改时触发回调,因此需要迭代事件

    例如:

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

    有三种方法可以观察JavaScript对象中的更改:

  • 方法(例如set/get或组合)
  • 使用计时器轮询以检查属性
  • 观察者处理由浏览器内部处理的属性
  • 方法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有自己的observer系统等等,所以如果您使用这些系统,您需要准备代码来处理不支持它的情况。这基本上意味着你需要投票。因此,set/get等方法是一种较好的方法

    观察者对属性很有用。它将允许您通过以下方式设置属性:

    myObject.value = 10;
    
    并触发一个回调,允许您处理该更改。注意,它将在任何属性更改时触发回调,因此需要迭代事件

    例如:

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