首页 > 代码库 > Event 与 PubSub
Event 与 PubSub
如题,这两基本是一个东西,Event是绑在对象上的,PubSub针对全局。
使用Event完全可以代替PubSub的工作。我就这么干过,比如 export default new Miku.Event()
所以说只要妹妹(Event)就可以了,并不需要姐姐(PubSub)!
一个Event对象
const Event = { evs:{} ,on(s,f){ return !this.evs[s] ?this.evs[s]=[f]: this.evs[s].push(f); } //.. };const o = {};Object.assign(o,Event);o.on(‘miku-miku-miku‘,_=>{});
最初用这种模式的时候,我就是用的上面那代码。但这么做evs对象就暴漏了出来,没法保证evs对象不被覆盖,这会产生冲突!
我们可以对这个对象加一层闭包,在Event对象相关方法的作用域中添加一个变量。
const MxEvent = o=>{ const evs = Object.create(null); const Event = { on(s,f){ return !evs[s] ?evs[s]=[f]: evs[s].push(f); } //... }; return Object.assign(o,Event);}
现在这样子基本没问题了。。但还是有坑,如果这个o对象被用作了原型对象,或者用作了assign的target,那么它的相关Event绑定的事件也被继承了下去,订阅的事件就混在一起了!
所以Event相关方法要是不可枚举的 ,最终这么写。
const MxEvent = o=>{ const evs = Object.create(null); return Object.defineProperties(o , { on : { value(s,f){ return !evs[s] ?evs[s]=[f]: evs[s].push(f); } ,writable:true } //... })}const o = MxEvent({});o.on(‘miku-miku-miku‘,_=>_);const o2 = MxEvent(Object.assign(o,{b:‘b‘}));//并不会对o发布o2.trigger(‘miku-miku-miku‘);
我代码没写全,trigger不想写了(实现很简单)。。上面这段代码仅针对es5+的浏览器,现在普及也还好吧?
完整的Event还有remove、once等方法,可能需要命名空间划分的功能,这些都可以实现的。我就不写了,主要是扯了一下Event模式的封装~
Event 与 PubSub
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。