gpt4 book ai didi

javascript - 如何在现有对象上调用 EventEmitter

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:50 25 4
gpt4 key购买 nike

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

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

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

最佳答案

我不确定您从哪里得到这样的想法:

 EventEmitter.call(emitter);

将神奇地为您的发射器对象提供所有 EventEmitter 功能。该语句的作用是调用 EventEmitter 构造函数并将其作为 this 传递给您的对象。争论。这将导致构造函数执行并可能在您的 emitter 上设置一些数据。对象,但它不附加 EventEmitter以任何方式为您的对象创建原型(prototype),因此 EventEmitter 上的任何方法原型(prototype)没有绑定(bind)到您的对象,因此为什么 .on()undefined .

<小时/>

有多种方法可以实现现有对象的功能,具体取决于您可以控制和尝试完成的任务。

如果你控制了你想要成为的对象的定义 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。

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

对于EventEmitter ,有一个特定的模块可以让您“混合”和 EventEmitter 。它的名字叫component-emitter on NPM并且非常容易使用。 socket.io 使用它 right here这样它的套接字对象就可以是 EventEmitter .

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

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

Emitter(Socket.prototype);
<小时/>

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

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;

关于javascript - 如何在现有对象上调用 EventEmitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com