Node.js是基于V8引擎实现的事件驱动无阻塞IO构架,Node.js能够在众多的后端JavaScript技术之中脱颖而出,正是因其基于事件的特点而受到欢迎。
这里主要介绍如何使用EventEmitter类来实现事件的发送与接收。
原型继承法
虽然,原型继承经常被视作 JavaScript 的一个弱点,但事实上,原型继承模型比经典的继承模型更强大。举例来说,在原型继承模型的基础之上建立一个经典的继承模型是相当容易的。
JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依此层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。
通过原型链实现继承:
通过原型链实现继承:
var EventEmitter = require('events').EventEmitter
function Client() {
EventEmitter.call(this);
}
Client.prototype.auth = function() {
console.log('arguments')
}
Client.prototype.__proto__ = EventEmitter.prototype;
var client = new Client();
//接收事件
client.on('auth', client.auth)
//发送事件
client.emit('auth')
类继承法
ES6提供了class和 extends两个关键字来实现继承,相对于原型继承。虽然只是语法糖,但它的语法确实更为简洁,也更符合面向对象语言的语法习惯。
var EventEmitter = require('events').EventEmitter
class Client extends EventEmitter {
constructor() {
super()
}
auth() {
console.log('arguments')
}
}
let client = new Client()
//接收事件
client.on('auth', client.auth)
//发送事件
client.emit('auth')
对象继承法
有时侯你也许并不需要创建一个类,而只需要对某个对象添加对象收发机制,此时只需要重新指定原型链即可。
var EventEmitter = require('events').EventEmitter
var client = {
auth() {
console.log('arguments')
}
};
client.__proto__ = EventEmitter.prototype;
// Subscribe to event.
client.on("auth", client.auth);
// Emit event.
client.emit("auth");
+ +