Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

干嘛用 PubSub,直接 Event 上!

  Event 与 PubSub 的本质是同样的东西,它们解决的问题都是模块间的通信。它们的区别是 Event 订阅一个对象上的事件,而 PubSub 订阅一个全局事件。也许我这么说 Java 党会喷我没读过书,但它们确实如此嘛,我最讨厌炒作概念的教育工作者了!
  如果每个对象都有一个 UniqueID 的话, Event 可以使用 PubSub 来实现。然而这并不意味着 PubSub 就比 Event 底层。比如 ES5 就没有提供一套获取对象 UniqueID 的方案,所以在 ES5 上 PubSub 无法实现 Event。但是反过来就不一样了,Event 完全可以实现 PubSub,可以把 PubSub 视为 global 对象的事件。但这么理解确实不太好,PubSub 这个概念应该和「类」关联起来理解。
  如果 PubSub 随便订阅发布的话,最终程序肯定会变成一坨,因为使用 PubSub 相当于使用全局变量。我觉得将 PubSub 作为类上的静态事件来理解会比较好。至少应该基于一个类,这样才能避免全局变量般的混乱。然而一旦如此理解就变成了 Event 的概念。也许一般的 Event 都是基于实例的,但是在 JavaScript 这种语言中,实例和类的概念是没有界限的,所以 Event 也完全可以实现「类的静态事件」这种行为。甚至如果一个 Event 实现支持冒泡到原型链的话自然就解决了 PubSub 的问题。比如我之前写过的 EventModel 2 就可以干这件事。
  其实我也不是说 PubSub 烂,只是 JavaScript 更适合使用 Event 而已。PubSub 的实现比较简单,一个 Object 里装一坨 Array 就 OK 了。而 Event 的实现在 ES5 中由于没有 Map 可以用,所以非常纠结。只有到 ES6 之后,有了 Map 的支持才比较容易。
  不要勉强地把其它编程语言中优秀的东西生搬硬套过来,JavaScript 是最神奇的编程语言!
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^