节点:当对 EventEmitter 的现有子类进行子类化时,如何拦截来自超类的事件?
node: When subclassing an existing subclass of EventEmitter, how can I intercept events from the superclass?
我正在尝试编写 Node 库的扩展。该库导出一个扩展 EventEmitter (class LibClass extends EventEmitter
) 的 class。它负责建立 websocket 连接,class 的实例会在连接建立时触发 "ready" 事件(不带参数)。
我想子class 这个现有的 class (class MyClass extends LibClass
),当那个 "ready" 事件从 superclass 发出时,我想保持它直到我的 class 执行额外的设置,然后再重新发射它。在功能上,我希望 LibClass
的所有方法都在 MyClass
上,但我想像这样覆盖某些事件的行为。
我将如何着手做这样的事情?是否可以通过 sub-classing 来完成,或者我是否必须在某处持有对 LibClass
实例的引用并在我自己的 class 中重复所有相关方法和事件以重定向它们那个实例?
正如 Bergi 在评论中所说,解决方案是覆盖 emit
事件,如下所示:
class MyClass extends LibClass {
constructor() {
super();
// ...
}
emit(name, ...args) {
if (name === 'someEvent') {
// Do custom setup for this event
}
// Other events will pass through unmodified
// When setup is completed, or if the event shouldn't be intercepted:
super.emit(name, ...args);
}
}
即使它通过使用子类和这种可怕的 emit
重写来工作,也不意味着您应该这样做。 EventEmitter 未设计为被覆盖,因此生成的代码将难以遵循,并且很容易随着未来的更改而中断。
正如您在问题 ("hold a reference to a LibClass instance somewhere and repeat all the relevant methods and events in my own class to redirect them to that instance") 中所建议的那样,组合是干净、安全且可维护的方式。
我正在尝试编写 Node 库的扩展。该库导出一个扩展 EventEmitter (class LibClass extends EventEmitter
) 的 class。它负责建立 websocket 连接,class 的实例会在连接建立时触发 "ready" 事件(不带参数)。
我想子class 这个现有的 class (class MyClass extends LibClass
),当那个 "ready" 事件从 superclass 发出时,我想保持它直到我的 class 执行额外的设置,然后再重新发射它。在功能上,我希望 LibClass
的所有方法都在 MyClass
上,但我想像这样覆盖某些事件的行为。
我将如何着手做这样的事情?是否可以通过 sub-classing 来完成,或者我是否必须在某处持有对 LibClass
实例的引用并在我自己的 class 中重复所有相关方法和事件以重定向它们那个实例?
正如 Bergi 在评论中所说,解决方案是覆盖 emit
事件,如下所示:
class MyClass extends LibClass {
constructor() {
super();
// ...
}
emit(name, ...args) {
if (name === 'someEvent') {
// Do custom setup for this event
}
// Other events will pass through unmodified
// When setup is completed, or if the event shouldn't be intercepted:
super.emit(name, ...args);
}
}
即使它通过使用子类和这种可怕的 emit
重写来工作,也不意味着您应该这样做。 EventEmitter 未设计为被覆盖,因此生成的代码将难以遵循,并且很容易随着未来的更改而中断。
正如您在问题 ("hold a reference to a LibClass instance somewhere and repeat all the relevant methods and events in my own class to redirect them to that instance") 中所建议的那样,组合是干净、安全且可维护的方式。