基于JS的event-manage事件管理库(一步一步实现)
关于文章
最近在提升个人技能的同时,决定把自己为数不多的沉淀记录下来,让自己理解的更加深刻,同时也欢迎各位看官指出不足之处。
随着node.js的盛行,引领着Javascript上天下地无所不能啊,本人确确实实的一个前端的忠实粉丝,于是乎……不能自拔…node的异步回调机制有效的提高了非密集型程序的高并发、速度快、性能优的需求同时,也饱受各大厂商的青睐,正是node将javascript又一次推向了热潮,于是小白又要埋头苦读,在各位大神和看官指引的道路下前进。
这篇文章是我的第一篇文章,很早就下定决心要记录和分享一些自己对已掌握的知识的一些理解(其实真心觉得将自己学到东西以文章的形式分享给大家,话风通俗易懂,不仅巩固了自己的知识体系,还会 润物无声),可迟迟没有勇气和信心。
这篇文章主要记录一下自己前几天手写的一个兼容node环境、浏览器环境、还支持Vue的…库。event-mange( npm仓库的名字)。node下的EventEmitter想必大家都很熟悉了,在思考过后决定自己也要产出一个类似的事件管理,不仅能在node下,还可以在浏览器端以 script标签 的方式引入使用,还有CMD、AMD下…于是,本小白开始动工了。
关于事件
在我们使用javascript开发时,我们会经常用到很多事件,如点击、键盘、鼠标等等,这些物理性的事件。而我们今天所说的我称之为事件的,是另一种形式的事件,订阅—发布,又叫做观察者模式,他定义了一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会收到通知,而在javascript中,一般习惯性的用事件模型来替代发布—订阅模式。
列举一个生活中的例子来帮助大家理解这一种模式。炎热的夏天,妈妈烧好了饭盛上桌,冒着热气,这时妈妈喊小明吃饭(小明在旁边的屋子里饿着肚子大吉大利晚上吃鸡…),小明出来一看,跟妈妈说,等一会 ‘饭凉了’ 再叫我,太烫了…十分钟后…妈妈喊你 ‘饭凉了’,快来吃饭,而这时小明听到了妈妈的喊话说 ‘饭凉了’,便快速的出来吃完了。这个例子,就是以上介绍的订阅—发布模式。例子中的小明就是订阅者(订阅的是 ‘饭凉了’),而妈妈则是发布者(将信号 ‘饭凉了’ 发布出去)。
使用订阅—发布模式的有着显而易见的优点:订阅者不用每时每刻都询问发布者饭是否凉了,在合适的事件点,发布者会通知这些订阅者,告诉他们饭凉了,他们可以过来吃了。这样就不用把小明和妈妈强耦合在一起,当小明的弟弟妹妹都想在饭凉了在吃饭,只需告诉妈妈一声。就像每个看官肯定都接触过的一种订阅—发布:DOM事件的绑定
document.body.addEventListener('click', function (e) {
console.log('我执行了...')
}, false)
回归正题:
****event-mange** 通过订阅-发布模式实现的**
一步一步的实现
event-mange 模块的主要方法:
- on:订阅者,添加事件
- emit:发布者, 出发事件
- once: 订阅者,添加只能监听一次之后就失效的事件
- removeListener:删除单个订阅(事件)
- removeAllListener: 删除单个事件类型的订阅或删除全部订阅
- getListenerCount:获得订阅者的数量
event-mange 模块的主要属性:
- MaxEventListNum: 设置单个事件最多订阅者数量(默认为10)
基本骨架
首先,我们希望通过 event.on , event.emit 来订阅和发布,通过构造函数来创建一个event实例,而on,emit分别为这个实例的两个方法, 同样的,以上列出的所有主要方法,都是event的对象的原型方法。
function events () {};
// 列举去我们想要实现的event对象的方法
event.prototype.on = function () {};
event.prototype.emit = function () {};
event.prototype.once = function () {};
event.prototype.removeListener = function () {};
event.prototype.removeAllListener = function () {};
event.prototype.getListenerCount = function () {};