WebSocket接続を開き、プロトタイプメソッドとしてコールバック関数を定義するプロトタイプベースのクラスPerson
を作成しました。javacript:コールバック付きプロトタイプと 'this'
this
はWebSocketオブジェクトを参照するため、別の変数を使用してPerson
のthis
を保持しています。しかし、私が複数のインスタンスを扱うとき、変数は上書きされます。ここで
が問題を示して小さなスニップです:複数のPerson
が作成されている場合は
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
ソケット経由でメッセージを送信しようとしたときに、私は次のエラーを取得する:
Uncaught Error: INVALID_STATE_ERR: DOM Exception 11
したがって、self
がグローバルに定義されており、コールバック内でPerson
のthis
へのハンドルを取得しようとすると失敗します。どのようにそれを達成するための任意の提案?
他の問題のなかで、最初に「var」と宣言する必要があります – qwertymk
@qwertymk 'var'は別の問題であるコンストラクタに対してローカルになります – unexplored