Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象构造函数中集成EventEmitter以用于原型方法_Javascript_Node.js_Eventemitter - Fatal编程技术网

Javascript 在对象构造函数中集成EventEmitter以用于原型方法

Javascript 在对象构造函数中集成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

我有以下奇怪的问题: 我写了一个“班级”游戏。这个类有一个构造函数和一个原型方法。我希望整个构造是一个EventEmitter。所以我想我可以为我的构造函数继承event.EventEmitter。 它首先看起来如下:

game.js

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);
});