【js设计模式】js发布-订阅模式(观察者模式)

简单实现发布-订阅模式,从功能上来说,也叫观察者模式,他俩唯一的区别就是发布-订阅模式有一个统一的调度中心,这里不做细的区分。

var event={
		//储存订阅的事件表
    eventList:{},
  	//监听事件
    listen:function(key,fn){
        if(!this.eventList[key]){
          	//如果没有key类型事件,创建一个新的数组,用于存放key类型事件
            this.eventList[key]=[]
        }
		//将事件函数放入同类型的事件列表里
        this.eventList[key].push(fn)
    },
  	//触发事件
    trigger:function(){
        var key = [].shift.call(arguments),
        list=this.eventList[key]
		//如果没有key类型事件或者key类型事件列表为空,直接返回,不做任何操作
        if(!list||list.length===0){
            return false
        }
		//顺序执行key类型的事件列表
        for(var i=0,fn;fn=list[i++];){
             fn.apply(this,arguments)   
        }
    },
  	//移除事件
    removeListener:function(key,fn){
        var list = this.eventList[key]
		//如果没有传入的key类型事件,直接返回
        if(!list||list.length===0){
            return false
        }
		//如果没有传入具体某个事件,将key类型事件列表全部移除
        if(!fn){
            list.length=0
            return true
        }
        for(var i=list.length-1,newFn;newFn=list[i];i--){
            if(fn===newFn){
              	//移除传入的事件
                list.splice(i,1)
            }
        }
    }
}
//使用
function foo(data){
    console.log(`Will be remove:${data}`)
}

//监听两次相同的事件clicks,不同的处理函数
event.listen("clicks",function(data){
    console.log("clicks",data)
})
event.listen("clicks",foo)

//两个函数都触发了
event.trigger("clicks"," hello!")
// clicks  hello!
// Will be remove: hello!

//移除一个函数事件
event.removeListener("clicks",foo)

//只触发了一个
event.trigger("clicks"," hello!")
// clicks  hello!

是不是和window.addEventListener还有window.removeEventListener很像?复制上边的代码到F12控制台,可以看到效果。

上一篇:element-ui的form数组表单验证(循环表单验证)
下一篇:vue3在单个组件实例上创建多个v-model 绑定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值