节点:当对 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") 中所建议的那样,组合是干净、安全且可维护的方式。