基本的に、監視可能なオブジェクトと、プロトタイプにコールバック関数を持つ別のクラス (つまり、サブスクライバー) を実装しました。
コールバックでは、クラスのプロパティで何かをしたいので、 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 のアラートが 1 回表示されることですが、1 番目の b.OnValueChanged.bind(b) が 2 番目の b.OnValueChanged.bind(b と「同一」であるため、代わりに 2 と 3 のアラートが 2 回表示されることです。 )
次のコードを前のコード ブロックに追加すると:
var c = b.OnValueChanged.bind(b);
var d = b.OnValueChanged.bind(b);
alert( c == d );
「false」というポップアップが表示されます
そこで、すべてのコールバックをプロトタイプではなくクラスに入れることを考えていました:
すなわち
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);
このソリューションは問題ないように見えますが、コールバックを持つすべてのオブジェクトにはコールバック関数のコピーが含まれます (プロトタイプを使用するとメモリ消費が削減されるため)