一个被观察者对象,多个观察者对象,当被观察者对象状态发生改变时,所有的观察者均得到通知。
function Event(){
this.clientList = []
}
Event.prototype = {
listen:function(key,fn){
if(!this.clientList[key]){
this.clientList[key] = []
}
this.clientList[key].push(fn)
},
trigger:function(){
// 取第一个输入参数,监听的事件名
var key = Array.prototype.shift.call(arguments)
// 根据事件名,取触发函数数组
var fns = this.clientList[key]
if (!fns||fns.length === 0){
return false
}
// 遍历触发函数
fns.map((fn) => {
fn.apply(this,arguments)
})
},
remove: function(key, fn){
var fns = this.clientList[key]
if (!fns) {
return false
}
if(!fn) {
// 未传入回调函数,取消订阅key对应消息的所有订阅回调函数
fn && (fns.length = 0)
} else {
// 删除对应订阅回调函数
fns.map((cur,index) =>{
if (fn === cur) {
fns.splice(index, 1)
}
})
}
}
}
var e1 = new Event()
function listenRemove(param) {
console.log('listenRemove:' + param)
}
e1.listen('e1-listen', function(param){
console.log('e1-listen1:' + param)
})
e1.listen('e1-listen', function(param){
console.log('e1-listen2:' + param)
})
e1.listen('e1-listen', listenRemove)
e1.trigger('e1-listen', 100)
e1.remove('e1-listen', listenRemove)
e1.trigger('e1-listen', 100)