我正在使用NW.js,以创建本地websocket客户端。我的工作原理是,现在我正在重构我的代码,使其更加面向对象。重新分配函数调用时出错,为什么?
Websockclient.prototype.connect = function() {
if (!("WebSocket" in window)) {
alert("WebSocket is NOT supported!");
} else {
uri = "ws://" + this.host + ":" + this.port;
this.ws = new WebSocket(uri);
this.ws.onopen = function(evt) { this.onOpen(evt); }
}
};
Websockclient.prototype.log = function(message) {
if (this.logEn == true) {
console.log(message);
}
};
Websockclient.prototype.onOpen = function(evt) {
this.log("connected");
this.ws.send("Client says Hi!");
};
连接打开正确,但在Websockclient.prototype.onOpen
函数调用中出现故障。错误输出如下:
[31910:31910:0530/115015:ERROR:edid_parser.cc(181)] invalid EDID: human unreadable char in name chrome-extension://oimdoepkkglchafiooagncfokloigedg/app/lib/websockclient.js:29 this.ws.onopen = function(evt) { this.onOpen(evt); }
TypeError: this.onOpen is not a function at WebSocket.ws.onopen (chrome-> > extension://oimdoepkkglchafiooagncfokloigedg/app/lib/websockclient.js:29:47)
它看起来像我有以下错误:
this.ws.onopen = function(evt) { this.onOpen(evt); }
(注:这是系NR文件websockclient.js 29)
我认为这个任务是不正确的,但我有点卡在这里。有人可以请解释我在这里错过了什么。
为什么你不只是做'this.ws.onopen = this.onOpen; '? Websockclient.prototype.onOpen只收到1个参数,它甚至被称为相同的,因此与包装函数相同。 – Azamantes
这是行不通的,因为onOpen函数中的this不会引用Websockclient对象。 – Gio
就像@Azamantes说的那样,添加'this.onOpen = this.onOpen.bind(this)' – Pimmol