数组更改侦听器

时间:2012-12-11 18:04:35

标签: javascript arrays listener extending

  

可能重复:
  Javascript - How to extend Array.prototype.push()?

如何通知(运行预定义的函数)对已注册数组的任何更改(或至少添加或删除元素)? 我尝试过使用原型。我不想因为没有提供我自己的一些代码示例而被责骂。所以这就是喜欢使用它的方式。

var myArray = [];
myArray.bind(function() {
    console.log('wtf'); // Wed Thu Fri and what were you thinking?
});

我不需要矫枉过正。我基本上知道我将使用的Array函数范围(push,pop,splice以及其他几个)。这是使用骨干MVC的一种方式。我想在数组上运行逻辑,然后相应地突出显示视图。但该视图已附加到集合中。对该集合的任何更改都会在视图中重新呈现实际的DOM。我不希望这样。我很简单,想要在视图中为CSS添加或删除一个类到相应的DOM。

3 个答案:

答案 0 :(得分:13)

我做的是我制作了自己的“数组”类型,只是扩展了原型数组,然后我添加了自己的处理程序。

例如:

var MyArray = function() {
    var arr = [];
    arr.push = function() {
        console.log("PUSHING", arguments);
        return Array.prototype.push.apply(this, arguments);
    }

    return arr;
};

用法:

var arr = new MyArray;
arr.push(12, 3, 45);
...

小提琴:http://jsfiddle.net/maniator/vF659/

答案 1 :(得分:2)

您正在寻找Object.observe,但它还没有广泛使用。在Chrome Canary中,在about:flags上启用了“实验性JavaScript”,您可以尝试以下操作:

​var arr = [];

​Object.observe(arr, function(changes) {
    console.log("The array changed. Changes:", changes);
});

答案 2 :(得分:1)

这样的事情会设置数组push()的全局监控。

(function() {
  var _push = Array.prototype.push;
  Array.prototype.push = function() {
    console.log("push");
    return _push.apply(this, arguments);
  }
})();

否则,正如Neal建议的那样,你可以创建另一个类。

var MonitoredArray = function() {
  var rv = [];
  var _push = rv.push;
  rv.push = function() {
    console.log("push()");
    console.log(arguments);
    return _push.apply(this, arguments);
  }
  return rv;
}

立即设置N个功能调用的基本监控。

var MonitoredArray = function() {
  var rv = [];

  // the names of the functions we want to log:
  var logged_fns = ["push", "pop"];

  for (var i in logged_fns) { (function() {
    var name = logged_fns[i]
    var fn = rv[name];

    rv[name] = function() {
      console.log(name + "()");
      console.log(arguments);
      return fn.apply(rv, arguments);
    }
  })()}

  return rv;
}

类似的改编也适用于第一个例子。