9th Day

事件驱动程序

Node.js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户

1
2
3
4
5
var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('xxx',xxx);
eventEmitter.emit('xxx');
eventEmitter.removeListener('xxx', xxx);

加载events模块,实例化EventEmitter类
用.on绑定事件,第一个参数是事件的名称,第二个参数是触发后执行的函数(监听器),该函数可以是匿名函数
用.emit触发事件,参数是事件的名称(监听器)
用.removeListener来移除某个事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var events = require('events');
var eventEmitter = new events.EventEmitter();
// 监听器 #1
var listener1 = function listener1() {
console.log('监听器 listener1 执行。');
}
// 监听器 #2
var listener2 = function listener2() {
console.log('监听器 listener2 执行。');
}
// 绑定 connection 事件,处理函数为 listener1
eventEmitter.on('connection', listener1);
// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);
var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");
// 处理 connection 事件
eventEmitter.emit('connection');
// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");
// 触发连接事件
eventEmitter.emit('connection');
eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");
console.log("程序执行完毕。");

事件可以绑定两个监听器,事件触发的时候按顺序执行

原型

prototype是对象都有的属性,除了用new生成的对象
如Person是一个对象,它有一个prototype的原型属性(因为所有的对象都有prototype原型!)prototype属性有自己的prototype对象,而pototype对象肯定也有自己的constuct属性,construct属性有自己的constuctor对象,神奇的事情要发生了,这最后一个constructor对象就是我们构造出来的function函数本身!
Person.prototype.construtor 就是Person本身
可以用原型增加方法或属性,Person.prototype.name = ‘’; Person.prototype.sayName = function (){ };
如果用原型增加的方法或属性和原来的相同,则默认调用原来已定义的属性和方法

1
2
3
4
5
6
7
8
9
10
11
12
function Person(name){
this.name = name;
this.sayMe = function(){
console.log(this.name)
}
}
var me = new Person('Lin');
console.log(me.prototype); //undefined
console.log(typeof Person.prototype); //object
console.log(Person.prototype.constructor); //function Person(name){...}