Node.js 如何在现有对象上调用EventEmitter
我想将现有对象设置为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); 将神奇地使您的发射器对象具有
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')