为什么继承EventEmitter的类无需额外实例化EventEmitter对象?
EventEmitter 实现疑问解答
核心原因
你预期的写法是组合模式的EventEmitter用法,而给出的正确代码用的是继承模式,所以不需要手动写new EventEmitter():
- 当你用
class Logger extends EventEmitter定义类时,Logger就是EventEmitter的子类,你执行const logger = new Logger()实例化类的时候,JS会自动调用父类EventEmitter的构造函数完成初始化,生成的logger实例本身就已经是完整的EventEmitter实例,自带on、emit、off等所有事件相关方法,不需要额外单独创建EventEmitter实例。 - 你预期的组合模式是把EventEmitter作为类的内部属性使用,这种场景下才需要手动创建
emitter = new EventEmitter(),而且调用的时候要写this.emitter.emit()才可以,你示例里直接写emitter.emit()会因为作用域找不到变量报错。
关于实例共享的疑问
继承模式下,logger实例本身就是事件监听和触发的载体:
你调用logger.on('msgLogger', callback)绑定监听,在类内部调用this.emit('msgLogger')触发事件,都是在同一个logger实例上操作,天然就是共享的,不需要额外的中间EventEmitter实例。
关于模块引入的疑问
仅仅是类引入了对应模块,并不会自动生成实例对吗?
是的,只引入events模块不会自动生成实例,实例化是在你执行new Logger()的时候完成的,因为Logger继承了EventEmitter,所以实例化的时候会自动完成父类部分的初始化,让Logger实例拥有EventEmitter的所有功能。
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

