EventEmitter本质上是一个观察者模式的实现,所谓观察者模式:
它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生改变时,所有依赖于它的对象都将得到通知。
因此最基本的EventEmitter,包含了一个观察者和一个被监听的对象,对应的实现就是EventEmitter中的on和emit:
var events=require('events');
var eventEmitter=new events.EventEmitter();
eventEmitter.on('say',function(name){
console.log('Hello',name);
})
eventEmitter.emit('say','Elsa');
eventEmitter是EventEmitter模块的一个实例,eventEmitter的emit方法发出say事件;通过eventEmitter的on方法监听,从而执行相应的函数。
EventEmitter构造函数的实现
function EventEmitter(){
this._events =Object.create(null);
}
addListener(eventName,listener):为指定事件添加一个监听器,别名为on
removeListener(eventName,listener):移除某个事件的监听器,别名为off
EventEmitter.prototype.on=EventEmitter.prototype.addListener
EventEmitter.prototype.off=EventEmitter.prototype.removeListener
on和once的区别:
on对于某一指定事件添加的监听器可以持续不断的监听相应的事件;once添加的监听器,监听一次后就会被消除。
两个特殊的事件:newListener和removeListener
当实例化EventEmitter模块之后,监听对象是一个对象,包含了所有的监听事件。而这两个特殊的方法就是针对监听事件的添加和移除。
newListener:在添加新事件监听器触发
removeListener:在移除事件监听器时触发
以newListener为例,会在添加新事件监听器的时候触发:
function hello(name){
console.log("hello",name);
}
var events=require('events');
var emitter=new events.EventEmitter();
emitter.on('newListener',function(eventName,listener){
console.log(eventName);
console.log(listener);
});
emitter.addListener('say',hello);
//输出say和[Function: hello]
从上述的例子来看,每当添加新的事件,都会自动的emit一个"newListener"事件,且参数为eventName(新事件的名)和listener(新事件的执行函数)。
同理特殊事件removeListener也是同样的,当事件被移除,会自动emit一个"removeListener"事件。
emit方法是出发事件,并执行相应的方法

on方法则是对于指定的事件添加监听函数,就是往事件对象中_events添加相应的属性。


网友评论