javascript: прототипы с обратными вызовами и «это»

Я создал класс на основе прототипа Person, который открывает соединение WebSocket и определяет функции обратного вызова как методы прототипа.

Поскольку внутри обратного вызова thisбудет ссылаться на объект WebSocket, я использовал другую переменную для хранения Personthis. Однако, когда я имею дело с несколькими экземплярами, переменная перезаписывается.

Вот небольшой фрагмент, показывающий проблему:

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, то при попытке отправить сообщение через сокет я получаю следующую ошибку:

Uncaught Ошибка: INVALID_STATE_ERR: DOM Exception 11

Таким образом, кажется, что selfопределен глобально, и моя попытка получить дескриптор Personthisвнутри обратный вызов не работает. Есть предложения, как этого добиться?

11
задан unexplored 4 April 2012 в 15:41
поделиться