Person
WebSocket 接続を開き、コールバック関数をプロトタイプ メソッドとして定義するプロトタイプ ベースのクラスを作成しました。
コールバック内でthis
は WebSocket オブジェクトが参照されるため、別の変数を使用しPerson
てthis
. ただし、複数のインスタンスを処理すると、変数が上書きされます。
これは、問題を示す小さな抜粋です。
function Person(name){
self = this
self.name = name
}
Person.prototype = {
getName : function(){
return self.name
},
openConnection : function(host, port){
self.pointCount = 0
self.ws = new WebSocket("ws://" + host + ":" + port)
self.ws.onopen = self.onOpenConnection
},
onOpenConnection : function() {
console.log(this) // prints the websocket
console.log(self) // prints the person
self.ws.send(self.name) // works only if one person exists
}
}
var p1 = new Person("Jonh")
var p2 = new Person("Adam")
console.log(p1.getName()) // Prints Adam
console.log(p2.getName()) // Prints Adam
p1.openConnection("localhost", 7000) // opens connection for p1
p2.openConnection("localhost", 7000) // opens another connection for p1
複数Person
のメッセージが作成された場合、ソケット経由でメッセージを送信しようとすると、次のエラーが発生します。
キャッチされないエラー: INVALID_STATE_ERR: DOM 例外 11
そのため、グローバルに定義されているようで、コールバック内の へのハンドルを取得しようとすると失敗しますself
。それを達成する方法について何か提案はありますか?Person
this