eventEmitter实现

没有做任何异常处理,简单模拟实现

  • 事件对象的每一个事件都对应一个数组

/*
    __events = {
        "事件1":[cb1,cb2],
        "事件2":[cb3,cb4],
        "事件3":[...],
        "事件4":[...],
    };
    
*/

class E{
    __events = {};

    constructor(){}

    //注册监听回调
    on(type , callback){
    	//已经有对应事件回调则加入数组
        if(this.__events[type]){
            this.__events[type].push(callback);
            return true;
        }
        else{
        //没有则放入新数组
            this.__events[type] = [callback];
            return false;
        }
    }

    // 触发事件
    emit(type, ...args){
        if(this.__events[type] && this.__events[type].length){
            this.__events[type].forEach(cb => {
                cb.call(this,args);
            });
        }
    }

    //取消事件对应回调
    off(type, callback){
        if(this.__events[type] && this.__events[type].length){
            this.__events[type] = this.__events[type].filter((cb)=>{
                return cb !== callback && cb.ref !== callback;
            })
            return true;
        }
        return false;
    }

    //注册一次
    once(type, callback){
        let once_func = function(...args){
            callback.call(this,...args);
            this.off(type,once_func);
        }
        //用于取消 off()
        once_func.ref = callback;
        this.on(type,once_func);
    }
}

let obj = new E();

function cb (data) { console.log(data);}
obj.on("f1",cb);
obj.off("f1",cb);
obj.emit("f1", 1,2,3,4,5);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值