维护一系列独特的功能

时间:2011-02-23 03:21:29

标签: javascript prototypejs

我认为函数可以像Javascript中的普通值一样传递。我认为他们评估了一些地址。从以下示例的输出中,我似乎是对的。

var f = function() { console.info('f'); };
var v = function() { console.info('v'); };

var arr = [];

arr.push(f);
arr.push(f);
arr;            // [function(), function()]
arr.uniq();     // [function()]
arr.push(f);
arr.push(f);
arr.push(v);
arr;            // [function(), function(), function()]
arr.without(f); // [function()]
arr.first()();  // v

但是,一旦我将此观察应用于“面向对象”的代码,uniqwithout就停止了工作。

A = Class.create({
 initialize: function() {
 },
 callback: function() {
 },
 add: function() {
  b.add(this.callback.bind(this));
 }
 remove: function() {
  b.remove(this.callback.bind(this));
 }
});

a = new A();

B = Class.create({
 initialize: function() {
  this.funcs = [];
 },
 add: function(func) {
  this.funcs.push(func);
  this.funcs = this.funcs.uniq();
 },
 remove: function(func) {
  this.funcs = this.funcs.without(func);
 }
});

b = new B();

a.add();  // b.funcs = [function()]
a.add();  // b.funcs = [function(), function()]
a.remove; // b.funcs = [function(), function()]

每次拨打b.add时,a.funcs都会变大; uniq不会删除重复项。每次拨打b.remove时,a.funcs都不会缩小; without未能找到该功能。

在我看来,我每次都会附加解析到不同地址的函数。 bind每次都会给出一个新地址吗?我该如何解决?我想确保a的{​​{1}}中没有两个相同的函数;如果在两个不同的地方定义的两个函数做同样的事情也没关系,但如果同一个函数句柄在数组中两次就不行了。

1 个答案:

答案 0 :(得分:2)

你有正确的想法 - JS函数是一等公民,bind每次调用它都会返回一个新函数。但是,您想要做的事情是不可能的。计算上不可能确定两个不同的函数是否对所有输入做同样的事情。

我前面看过一个类似的问题,让我看看我是否可以把它挖出来。 here it is