我试图为nodejs&创建一个简单的类(包装器)。 socket.io游戏。
module.exports = class client {
constructor(socket) {
this.socket = socket;
this.createEvents();
}
createEvents() {
console.log('creating events');
this.socket.on('handshake', this.onHandshake);
this.socket.on('disconnect', this.onDisconnect);
}
sendHandshake() { // <------------ sendHandshake is there?
console.log('sending handshake');
this.socket.emit('handshake');
}
onHandshake() {
console.log('handshake received');
this.sendHandshake(); // <----- TypeError: this.sendHandshake is not a function
}
onDisconnect() {
console.log('client disconnected');
}
}
它应该给我这个输出
creating events
handshake received
sending handshake
但它给了我这个错误
creating events
handshake received
TypeError: this.sendHandshake is not a function
答案 0 :(得分:0)
传递函数时,它不会自动绑定到拥有该函数的对象。一个更简单的例子是:
const EventEmitter = require('events');
class client {
constructor() {
this.ev = new EventEmitter;
this.ev.on('handshake', this.onHandshake);
this.ev.emit('handshake');
}
onHandshake() {
console.log(this); // EventEmitter
}
}
相反,您必须将函数绑定到client
,只需使用this.onHandshake.bind(this)
或() => this.onHandshake()
即可轻松完成。前者明确绑定this
。后者在词汇上绑定this
,即this
在函数中定义的位置。
我还要指出,您通过发出handshake
来回复handshake
- 不确定是否有意或需要。