EventEmitter随便记录

最近突然想到不同事件监听对象能否相互触发,于是测试了一下。

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

结果当然是不能,不过通过类的组合是可以的。

你可能感兴趣的:(EventEmitter随便记录)