nodeJS中大部分模块,都继承自Event模块。Event模块是一个简单的事件监听器模式的实现,具有addListener/on,once,removeListenter、removeAllListener、emit等基本的事件监听模式方法的实现。它与前端DOM树上的事件并不相同,因为它不存在冒泡,逐层捕获等属于DOM的事件行为,也没有preventDefault()、stopPropagation()等处理事件传递的方法。
我们看一看事件模块的用法
var EventEmitter = require('events').EventEmitter;
// 创建EventEmitter的一个实例
var life = new EventEmitter();
//添加事件监听(on 或addListener)
//一个事件最多能绑定十个监听器 当超过十个监听器 会有警告
//可以对最多的监听器进行设置
life.setMaxListenters = 11;//将最大监听数提高到了11个
//添加ask事件
life.on('ask',function(who){
console.log(who + '.....1');
})
life.on('ask',function(who){
console.log(who + ".....2")
})
function test(who){
console.log(who + '.....3');
}
life.on('ask',test);
life.on('ans',function(){
console.log('ans.....1');
})
// 移除事件 移除事件时 只能移除事件的回调函数为具名函数的事件
life.removeListener('ask',test);
//life.removeAllListeners();//删除了全部事件 包括ask和ans
life.removeAllListeners('ask');//删除了ask事件
// 触发事件
life.emit('ask','charlene');//执行该函数 存在返回值 返回值为布尔值 表示是否被监听
life.emit('ans');
// 方法listeners可以检测当前监听的数量
console.log(life.listeners('ask').length);
//EventEmitter.listenerCount也可以检测当前监听的数量
console.log(EventEmitter.listenerCount(life,'ask'));
事件的继承
实现一个继承了EventEmitter类是十分简单的,以下是NodeJS中继承EventEmitter的实现方法
function Live(){
events.EventEmitter.call(this);
}
util.inherits(Live,events.EventEmitter);
var live = new Live();
live.on('say',function(){
console.log('ccccc');
})
live.emit('say');
Live类继承了events.EventEmitter,所以Live类就存在事件处理函数。