基本上,我已经实现了一个可观察对象和另一个在其原型中具有回调函数的类(即订阅者)。
在回调中,我想对类的属性做一些事情,因此,必须正确设置 this。这是一个例子。
Subscriber = function() {
this.pararmA = 1;
}
Subscriber.prototype.OnValueChanged = function(value){
alert(this.paramA + value);
}
在我的观察中,监听器必须是唯一的(即不允许将同一个监听器多次添加到订阅者列表中)。现在下面是测试。
var a = Observable(0);
var b = new Subscriber();
a.AddListener(b.OnValueChanged.bind(b));
a.AddListener(b.OnValueChanged.bind(b));
a(1);
a(2);
我期望的是我看到一次警报 2 和 3,但是由于第一个 b.OnValueChanged.bind(b) 与第二个 b.OnValueChanged.bind(b) “相同”,我看到了两次警报 2 和 3 )
如果我将以下代码添加到上一个代码块中:
var c = b.OnValueChanged.bind(b);
var d = b.OnValueChanged.bind(b);
alert( c == d );
我会得到一个弹出窗口说“假”
所以我想把所有的回调都放到类而不是原型中:
IE
Subscriber = function() {
this.pararmA = 1;
this.OnValueChanbed = function(value){
alert(this.paramA + value);
}.bind(this);
}
然后在代码中按原样使用回调:
var a = Observable(0);
var b = new Subscriber();
a.AddListener(b.OnValueChanged);
a.AddListener(b.OnValueChanged);
这个解决方案看起来不错,但是每个带有回调的对象都会有一个回调函数的副本(因为使用原型应该减少内存消耗)