関数を正しく割り当てている(関数を割り当てる方法は1つだけです)、問題は関数のコンテキストが変更されることです。 1
this.ws.onopen = this.onOpen;
可能性::
は、今、私が想定し、WebSocket
内部に、どこかでこの機能は、開口接続への応答として呼び出されます(イベントハンドラのような
この行を考えてみましょう)、おそらく同様
this.onopen();
What this
refers to inside a function is determined by how a function is called on run time(<-
このリンクを読む、それは多くの助けになります)。定義時にバインドされていません。あなたの場合、this
はWebSocket
インスタンスを指します。だから、内部に、このように呼ばれるMyObject.prototype.onOpen
内、this
はWebSocket
ws
性質を持っていない場合、およびないMyObject
インスタンス、this.ws
を参照する場合
。
これは、2つの方法で解決することができます:
this
が既にthis.ws
を指しているので、あなたがthis
に直接send
を呼び出すことができます。
MyObject.prototype.onOpen = function() {
this.send("hello");
};
あなたはMyObject.prototype.onOpen
内部this
は常にしたい場合MyObject
インスタンスを参照するには、インスタンスへの明示的な参照を保持する必要があります。閉鎖を通じて:onOpen
内部今
var self = this;
this.ws.onopen = function() {
self.onOpen();
};
、this
あなたは、コンストラクタでそれを設定すると同じように、プロパティws
を持ってMyObject
インスタンスを参照します。
this.ws.onopen = this.onOpen.bind(this);
可能性2:のECMAScript 5を支持ブラウザで
、機能が既にこの技術のための方法を有する、.bind()
と呼ば
またということかもしれないWebSocket
このようにしてonopen
を呼び出します。
その場合
this.onopen.call(null);
、this
コードは(それが問題である任意の場合には、問題ではない)厳密モードで実行するか否かに応じて、window
を参照するであろういずれかまたはundefined
あろう。
この状況は、最初の可能性から2番目の解決策でしか解決できませんでした。
最初の例はなぜ機能しますか?この場合
var ws = new WebSocket(something, somethingelse);
ws.onopen = function() {
ws.send("hello");
console.log("works");
}
、あなたがws.onopen
に割り当てる機能がws
また、このスコープで定義された変数の上に閉じ、閉鎖です。この意味では、問題を解決する第2の方法と似ていますが、
ws.onopen = function() {
this.send("hello");
console.log("works");
}
などと考えられます。
あなたは 'new'キーワードを使用していますか?ここに間違ったものがたくさんあります。あなたは正確に何をしようとしていますか? –
「プロパティキーワード」とは何ですか? –
onOpen関数はWebSocketオブジェクトによって呼び出され、 "this"は実際にはWebSocketオブジェクトになりますが、MyObjectではなくなります。 (*もし私が物事を乱していないなら.. *) – moka