手写观察者模式,并实现vue中事件总线
观察者模式思路:
1. 需要一个容器装所有注册的观察者
2. 三个方法分别为:注册观察者的方法,发布信息的方法,移除观察者的方法
let observe = (function(){
// 容器存放所有观察者
let message = {}
return {
// 注册观察者
on: function(){
if(arguments.length != 2) throw new Error(`该函数需要两个参数, 参数1为函数名称的字符串, 参数2为一个回调函数`)
message[arguments[0]] = arguments[1]
},
// 发布信息
emit: function(){
if(arguments.length < 1 || arguments.length > 2) throw new Error(`该函数参数1需要一个函数字符串名称(必须), 携带的参数或对象(可选)`)
for(let key in message){
if(key === arguments[0]) message[key](arguments[1] || undefined)
}
},
// 移除观察者
off: function(){
if(arguments.length != 1) throw new Error(`该函数需要一个函数字符串名称(必须)`)
for(let key in message){
if(key === arguments[0]) delete message[key]
}
console.log('message', message)
}
}
})()
// 测试
observe.on('fn1', (a) => {
console.log(a)
})
observe.emit('fn1', {a: 123})
observe.on('fn2', (a) => {
console.log(a)
})
observe.emit('fn2', '我发送的信息')
observe.off('fn1')
observe.emit('fn1', 123)
/*
实现vue中事件总线则只需要在原型上挂载observe
Vue.prototype.$observe = observe通过this.$observe调用
*/