javascript:带有回调和 'this' 的原型(prototype)

标签 javascript callback websocket prototype

我创建了一个基于原型(prototype)的类 Person,它打开一个 WebSocket 连接并将回调函数定义为原型(prototype)方法。

因为在回调中 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 Error: INVALID_STATE_ERR: DOM Exception 11

看来 self 是全局定义的,我试图在回调中获取 Personthis 句柄的尝试失败了。关于如何实现这一点有什么建议吗?

最佳答案

当你这样做时:

self = this

您正在隐式创建一个全局变量,该变量(因为它是全局的)对所有实例都具有相同的值。局部变量,必须在它们前面有 varletconst,例如以下之一:

var self = this;
const self = this;
let self = this;

但是,这不是您的解决方案。您需要改用 this。而且,如果您要为 websocket 提供回调并且您想要与之相关联的人,我建议您只需在 websocket 上放置对 Person 对象的引用,以便您可以从那里检索它。而且,每条语句末尾缺少的分号是怎么回事?不管怎样,这里有一些固定的代码:

function Person(name){
    this.name = name;
}

Person.prototype = {
    getName : function(){
        return this.name;
    },

    openConnection : function(host, port){
        this.pointCount = 0;
        this.ws = new WebSocket("ws://" + host + ":" + port);
        // save person reference on the web socket
        // so we have access to the person from web socket callbacks
        this.ws.person = this;   
        this.ws.onopen = this.onOpenConnection;
    },

    onOpenConnection : function()   {
        // "this" will be the websocket
        // "this.person" is the person object
        console.log(this); // prints the websocket
        console.log(this.person); // prints the person
        this.send(this.person.name); // works only if one person exists
    }
}

关于javascript:带有回调和 'this' 的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014552/

相关文章:

javascript - C# 中的作用域、变量访问

java - 对于每个 Spring websocket 事件,Principal 为 null

javascript - 点击图片触发jquery中的其他图片

JavaScript 正则表达式 : test and exec

javascript - Not not (!!) 在 if 条件内

javascript - jquery中如何判断一个div在另一个div的前面还是后面?

JavaScript:4 个异步函数在继续之前按顺序等待彼此完成?

javascript - 存储来自 Google JavaScript API 请求的响应

Javascript 无法连接到 PHP Ratchet WebSocket 服务器

sockets - 什么是 Socket.IO 发送和获取数据(确认)?