node:当继承EventEmitter的现有子类时,如何拦截来自超类的事件?

时间:2018-06-17 14:56:58

标签: javascript node.js eventemitter

我正在尝试编写Node库的扩展。该库导出一个扩展EventEmitter(class LibClass extends EventEmitter)的类。它负责建立websocket连接,并且在建立连接时,类的实例触发“就绪”事件(没有参数)。

我想继承这个现有的类(class MyClass extends LibClass),当从超类发出“ready”事件时,我想保留它直到我的类执行其他设置,然后再重新发出它。从功能上讲,我希望LibClass的所有方法都在MyClass上,但我想覆盖某些事件的行为。

我将如何做这样的事情?可以通过子类来完成,还是我必须在某处保存对LibClass实例的引用,并重复我自己的类中的所有相关方法和事件,以将它们重定向到该实例?

2 个答案:

答案 0 :(得分:0)

正如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);
  }
}

答案 1 :(得分:0)

即使通过使用子类和df的这种可怕的覆盖来起作用,它实际上也不意味着您应该这样做。 EventEmitters并非旨在被覆盖,因此生成的代码将难以遵循,并且易于随将来的更改而中断。

组合是一种干净,安全且可维护的方式,正如您在问题中所建议的那样(“在某处保留对LibClass实例的引用,并在我自己的类中重复所有相关的方法和事件以将它们重定向到该实例“)。