Javascript 在对象构造函数中集成EventEmitter以用于原型方法
我有以下奇怪的问题: 我写了一个“班级”游戏。这个类有一个构造函数和一个原型方法。我希望整个构造是一个EventEmitter。所以我想我可以为我的构造函数继承event.EventEmitter。 它首先看起来如下: game.jsJavascript 在对象构造函数中集成EventEmitter以用于原型方法,javascript,node.js,eventemitter,Javascript,Node.js,Eventemitter,我有以下奇怪的问题: 我写了一个“班级”游戏。这个类有一个构造函数和一个原型方法。我希望整个构造是一个EventEmitter。所以我想我可以为我的构造函数继承event.EventEmitter。 它首先看起来如下: game.js var EventEmitter = require('events').EventEmitter; var util = require('util'); /* Game factory */ function Game(catalo
var EventEmitter = require('events').EventEmitter;
var util = require('util');
/*
Game factory
*/
function Game(catalogue, speed) {
//EventEmitter.call(this);
this.catalogue = catalogue || null;
this.speed = speed || 10;
}
Game.prototype.listen = function(){
var self = this;
setInterval(function(){
self.emit('init', 0);
}, 500);
}
util.inherits(Game, EventEmitter);
module.exports = Game;
我使用socket.io连接到客户端。在我的主套接字例程中,我使用以下代码开始一个新游戏(实例化)
controller.js
socket.on('startGame', function(){
var myGame = new Game('default', 10);
myGame.init();
myGame.on('init', function(status){
console.log('Did start with status code: ', status);
});
};
这无法按预期工作。错误为:
Missing error handler on `socket`.
TypeError: undefined is not a function
at Socket.<anonymous>
那么这里出了什么问题?
请注意,我不需要
EventEmitter.call(this);
在第二个示例中的构造函数中。
但是,独立于对它的评论或保留,这一切都会改变。
为什么我需要这个?是吗
也许你能帮忙。亲切的问候。
Martin您必须移动
util.inherits(游戏、事件发射器)在开始向原型添加函数之前,将代码>添加到。util.inherits()
会干扰原型,因此在此之前放置在原型上的任何内容都将丢失
此外,当您从另一个对象(如EventEmitter
)继承时,确实应该调用父构造函数(EventEmitter.call(this)
),因为它可能需要自己进行一些初始化。更新了Node.js v11.12.0的示例
const EventEmitter = require('events');
module.exports = class Game extends EventEmitter {
constructor(catalogue, speed) {
super();
this.catalogue = catalogue || null;
this.speed = speed || 10;
}
listen() {
setInterval(() => {
self.emit('init', 0);
}, 500);
}
};
let myGame = new Game('default', 10);
myGame.listen();
myGame.on('init', status => {
console.log('Did start with status code: ', status);
});
这里有一些漂亮的新东西
- 不再需要require('events')。EventEmitter后缀部分。它仍然可以向后兼容
- 可以使用类和扩展
- 可以在setInterval中使用箭头函数,该函数隐式绑定到
this
,而无需将其映射到self
const EventEmitter = require('events');
module.exports = class Game extends EventEmitter {
constructor(catalogue, speed) {
super();
this.catalogue = catalogue || null;
this.speed = speed || 10;
}
listen() {
setInterval(() => {
self.emit('init', 0);
}, 500);
}
};
let myGame = new Game('default', 10);
myGame.listen();
myGame.on('init', status => {
console.log('Did start with status code: ', status);
});