如何通知(运行预定义的函数)对已注册数组的任何更改(或至少添加或删除元素)? 我尝试过使用原型。我不想因为没有提供我自己的一些代码示例而被责骂。所以这就是喜欢使用它的方式。
var myArray = [];
myArray.bind(function() {
console.log('wtf'); // Wed Thu Fri and what were you thinking?
});
我不需要矫枉过正。我基本上知道我将使用的Array函数范围(push,pop,splice以及其他几个)。这是使用骨干MVC的一种方式。我想在数组上运行逻辑,然后相应地突出显示视图。但该视图已附加到集合中。对该集合的任何更改都会在视图中重新呈现实际的DOM。我不希望这样。我很简单,想要在视图中为CSS添加或删除一个类到相应的DOM。
答案 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);
...
答案 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;
}
类似的改编也适用于第一个例子。