最近突然想到不同事件监听对象能否相互触发,于是测试了一下。
const EventEmitter = require('events');
class A extends EventEmitter {
constructor() {
super();
this.on('add', (x, y) => {
console.log('event add: ', x + y);
});
}
}
class C extends A {
constructor() {
super();
this.on('mul', (x, y) => {
console.log('event mul: ', x * y);
});
}
}
class B extends EventEmitter {
constructor() {
super();
this.c = new C();
this.on('sub', (x, y) => {
console.log('event sub: ', x - y);
});
}
emit(event, ...args) {
if (this.listenerCount(event)) {
// EventEmitter内部由this取监听器执行, 由于super调用方法内部this指向子类,所以能成功执行对应事件
super.emit(event, ...args);
} else {
this.c.emit(event, ...args);
}
}
}
// A的事件不能由B触发(如果A丶B之间不是继承关系),只能为各自实列触发(类的组合,触发)
let b = new B();
b.emit('add', 1, 2);
b.emit('sub', 3, 4);
b.emit('mul', 3, 3);
// event add: 3
// event sub: -1
// event mul: 9
结果当然是不能,不过通过类的组合是可以的。