Javascript 内でのプロトタイピングとクロージャーに頭を悩ませ始めていますが、完全ではありません。以下のこの例では、私の 2 つのオブジェクトで、2 番目のオブジェクトはスコープ/コンテキストを失い、最初のオブジェクトの ID を引き継いでいるようです。
function broker()
{
var _q = [];
this.add = function(delegate) {_q[_q.length] = delegate; }
this.broadcast = function(message)
{
for(qi = 0; qi < _q.length; qi++)
{
_q[qi](message);
}
}
}
function subscriber(abroker, yourname)
{
me = this;
this.myprop = yourname;
this.subby = function(message){ alert(message + " " + me.myprop + me.dosomething() + secret()); };
this.dosomething = function() {return "...abc";};
function secret(){return "...def";}
abroker.add(this.subby);
}
var thebroker = new broker();
var mysub = new subscriber(thebroker, 'mysub');
var myothersub = new subscriber(thebroker, 'myothersub');
thebroker.broadcast("hello from");
サブスクライバー オブジェクトでデリゲートを呼び出し、内部で関数を実行できる共通のブローカー オブジェクトが存在するという考え方です。しかし、ブローカーによって呼び出された関数内でスコープが失われています。
出力: 2 つの警告ウィンドウ、両方の出力: "myothersub"、mysub がスコープを失ったようです?
元のオブジェクトの外側で subby デリゲートを明示的に宣言し、オブジェクト全体を参照することで、正しい応答を得ることができました。
サブスクライバー オブジェクト内で this.subby を宣言する代わりに、次のようにします。
mysub.subby = function(message)
{
alert(message + " " + mysub.myprop); // obv the dosomething his hidden
}
thebroker.add(mysub.subby);
メモリから直接入力したため、上記の構文のいずれかが間違っている場合はすみません。実際には機能しますが、慣れ親しんだカプセル化が失われます。
オブジェクトのスコープ/コンテキストを失うことなく、元の手法を使用してカプセル化するにはどうすればよいですか?