Node.js 如何在现有对象上调用EventEmitter

Node.js 如何在现有对象上调用EventEmitter,node.js,constructor,eventemitter,Node.js,Constructor,Eventemitter,我想将现有对象设置为EventEmitter,例如: var emitter = {}; EventEmitter.call(emitter); console.log(emitter.on); 但是,emitter.on是未定义的,而不是函数。最简单的方法是使用关键字创建EventEmitter的子类。下面是一个关于如何通过创建自己的EventEmitter的简单示例 我不知道你从哪里得到这样的想法: EventEmitter.call(emitter); 将神奇地使您的发射器对象具有

我想将现有对象设置为EventEmitter,例如:

var emitter = {};
EventEmitter.call(emitter);
console.log(emitter.on);

但是,emitter.on是未定义的,而不是函数。

最简单的方法是使用关键字创建
EventEmitter
的子类。下面是一个关于如何通过创建自己的
EventEmitter
的简单示例



我不知道你从哪里得到这样的想法:

 EventEmitter.call(emitter);
将神奇地使您的发射器对象具有所有EventEmitter功能。该语句所做的是调用EventEmitter构造函数,并将其作为
this
参数传递给对象。这将导致构造函数在
emitter
对象上执行并可能设置一些数据,但它不会以任何方式将
EventEmitter
原型附加到对象上,因此
EventEmitter
原型上的任何方法都不会绑定到对象,因此
。on()
未定义的


根据您可以控制和尝试完成的内容,有多种方法可以利用现有对象的功能

如果您控制要成为
EventEmitter
的对象的定义,那么您将只希望从EventEmitter对象继承,然后您的对象将只是“成为”一个
EventEmitter
,并拥有其所有方法和数据

使用ES6类语法继承:

// myobj.js
const EventEmitter = require('events');

// inherit directly from EventEmitter
class MyObj extends EventEmitter {
  constructor () {
    super() 
  }
  // your other custom methods here
}

module.exports = MyObj;
然后,您可以这样使用:

const MyObj = require("myobj.js");
let obj = new MyObj();
obj.on("hello", data => {
    console.log("got hello message");
});

obj.emit("hello", "to you");

如果您不控制要为其提供EventEmitter逻辑的对象的定义或构造,那么您需要决定是“成为”还是“拥有”EventEmitter

在“成为”路径中(您希望对象“成为”
EventEmitter
除了它自己的功能外,您还可以混合EventEmitter对象的逻辑,并在创建自己的对象后将所有方法和数据添加到自己的对象中。这不是万无一失的,因为某些类型的对象可能依赖私有数据,而您无法适当地混合。但是,它确实适用于许多对象。

对于
EventEmitter
,有一个特定的模块已构建,允许您“混入”和
EventEmitter
。它被调用并且非常容易使用。socket.io使用它,以便它的套接字对象可以是
EventEmitter

var Emitter = require('component-emitter');

/**
 * Mix in `Emitter`.
 */

Emitter(Socket.prototype);

因为“有一个”路径,您只需创建一个
EventEmitter
对象并将其放入您自己对象的实例数据中,然后为您的
EventEmitter
功能引用该特定对象。您可以手动获取该对象并使用它,也可以使用一些方法自动使用它。这对于实现,但在某些情况下使用起来并不方便(这实际上取决于您尝试执行的操作的细节)


您可以通过两种方式解决此问题,一种是扩展
EventEmitter
类,另一种是将
emitter
的原型设置为
EventEmitter
的原型

// using es6 class 

class MyEmitter extends EventEmitter {
    constructor() {
        super();
    } 
}

const emitter = new MyEmitter();

emitter.on("greet", greet => console.log(greet));

emitter.emit("greet", "hello");

// if you want to use this on a different file you have to export the emitter object



// the second alternative if you don't want to use a class

const emitter = {};

Object.setPrototypeOf(emitter, events.prototype); 

// or

Object.setPrototypeOf(emitter, events.EventEmitter.prototype);

emitter.on("greet", greet => console.log(greet));

emitter.emit("greet", "hello");

您仍然可以使用
EventEmitter.call(emitter);

诀窍如下:

const MyFunctionEmitter = function() { 
    EventEmitter.call(this, {objectMode: true});
     
    this.on('myevent', function(s) { 
      console.log(s)
    })

  }

MyFunctionEmitter.prototype = Object.create(EventEmitter.prototype, {
    constructor: { value: MyFunctionEmitter }
}); 

//inherit and apply native event emitter to our myFunction object
util.inherits(MyFunctionEmitter, EventEmitter);  
  
  var myEmitter = new MyFunctionEmitter() 
  myEmitter.emit('myevent', 'my event message')
可能重复的
class MyObj {
  constructor () {
    super() 
    this.myEmitter = new EventEmitter();
  }
  // your other custom methods here
  broadcast(msg, data) {
      // use the internal eventEmitter object we have in our instance data
      this.myEmitter.emit(msg, data);
  }
}

module.exports = MyObj;
// using es6 class 

class MyEmitter extends EventEmitter {
    constructor() {
        super();
    } 
}

const emitter = new MyEmitter();

emitter.on("greet", greet => console.log(greet));

emitter.emit("greet", "hello");

// if you want to use this on a different file you have to export the emitter object



// the second alternative if you don't want to use a class

const emitter = {};

Object.setPrototypeOf(emitter, events.prototype); 

// or

Object.setPrototypeOf(emitter, events.EventEmitter.prototype);

emitter.on("greet", greet => console.log(greet));

emitter.emit("greet", "hello");
const MyFunctionEmitter = function() { 
    EventEmitter.call(this, {objectMode: true});
     
    this.on('myevent', function(s) { 
      console.log(s)
    })

  }

MyFunctionEmitter.prototype = Object.create(EventEmitter.prototype, {
    constructor: { value: MyFunctionEmitter }
}); 

//inherit and apply native event emitter to our myFunction object
util.inherits(MyFunctionEmitter, EventEmitter);  
  
  var myEmitter = new MyFunctionEmitter() 
  myEmitter.emit('myevent', 'my event message')