express源码剖析1

在通读源码之前,先把一些比较难理解的代码吃透:

1.EventEmitter.prototype

mixin(app, EventEmitter.prototype, false);

app为一个函数,也是对象。

mixin是一个类库(merge-descriptors)它就是一种mixin设计模式,作用是让app这个对象具有EventEmitter.prototype的方法。

第三个参数表示“是否重新定义app中与EventEmitter.prototype中存在重名的方法。

2.EventEmitter类

EventEmitter是nodejs中event的一个类,也是唯一类。它的核心就是事件触发与事件监听功能的封装。

3.EventEmitter实例的产生

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

4.EventEmitter类的静态方法

4.1 newListener事件

当注册一个事件时,触发newListener事件,例如:

const myEmitter = new MyEmitter();
// Only do this once so we don‘t loop forever//定义触发newListener事件的函数myEmitter.once(‘newListener‘, (event, listener) => {
  if (event === ‘event‘) {
    // Insert a new listener in front
    myEmitter.on(‘event‘, () => {
      console.log(‘B‘);
    });
  }
});
myEmitter.on(‘event‘, () => {
  console.log(‘A‘);
});
myEmitter.emit(‘event‘);
//B
//A

4.2 removeListener事件

对应newListener事件,当监听器被移除时,‘removeListener‘ 事件被触发。

5.EventEmitter类的静态成员

5.1EventEmitter.defaultMaxListeners

唯一的静态成员,默认值是10,表示对应监听同一的事件个数是10个,不建议修改这个参数,否则会影响到所有EventEmitter实例的。

6.EventEmitter的prototype对象

var MyEmitter = require(‘events‘);
console.log(MyEmitter.prototype); 

结果是:

EventEmitter {
  domain: undefined,
  _events: undefined,
  _maxListeners: undefined,
  setMaxListeners: [Function: setMaxListeners],
  getMaxListeners: [Function: getMaxListeners],
  emit: [Function: emit],
  addListener: [Function: addListener],
  on: [Function: addListener],
  once: [Function: once],
  removeListener: [Function: removeListener],
  removeAllListeners: [Function: removeAllListeners],
  listeners: [Function: listeners],
  listenerCount: [Function: listenerCount] }
[Finished in 0.3s]

回到1,就表示app对象(函数)它具有以上方法,即app继承了EventEmitter的原型对象

时间: 2024-10-24 05:19:03

express源码剖析1的相关文章

express源码剖析(3)

express/appliction.js application.js对外的方法可以分成四类: 设置/初始化成员变量,主要是对成员变量settings进行设置,这样的方法有:enabled.enabled.disabled. disable和set方法. 设置路由和对每个路由设置中间件:这样的方法有:use.router,all,param和methods方法. 设置模板引擎的方法:engine和render. 启动node服务器对res和req操作的方法:listen和handler. 1.

express源码剖析--Router模块

1.加载模块执行代码: methods.forEach(function(method){ //method是http协议的各种请求方法,如:get,put,headee,post Route.prototype[method] = function(){ ....为method的各种方法构造一个Layer,并且放入stack数组中 }; });//其实router.all()的功能和methods的功能差不多. 2.构造函数 function Route(path) { //三个成员, 路由的

《STL源码剖析》---stl_pair.h阅读笔记

pair是STL中的模板类型,它可以存储两个元素,它也被称作"对组".在map中已经用到了它,pair其实就是一个struct结构,存有两个public的元素,重载了几个运算符,没有什么成员函数,源代码很简单. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_pair.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy,

《STL源码剖析》---stl_tree.h阅读笔记

STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率.红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索.插入.删除都能以O(nlogn)时间完成.平衡可以在一次或者两次旋转解决,是"性价比"很高的平衡二叉树. RB-tree(red black tree)红黑树是平衡二叉树.它满足一下规则 (1)每个节点不是红色就是黑色. (2)根节点是黑色. (3)如果节点为红色,则其子节点比为黑色. (4)任何一个节

《STL源码剖析》---stl_iterator.h阅读笔记

STL设计的中心思想是将容器(container)和算法(algorithm)分开,迭代器是容器(container)和算法(algorithm)之间的桥梁. 迭代器可以如下定义:提供一种方法,能够依序寻访某个容器内的所有元素,而又无需暴露该容器的内部表达方式. 在阅读代码之前,要先了解一个新概念:Traits编程技法 template <class T> struct MyIter { typedef T value_type //内嵌型别声明 T *ptr; MyIter(T *p = 0

STL 之 queue、priority_queue 源码剖析

/* * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all c

《STL源码剖析》---stl_hashtable.h阅读笔记

在前面介绍的RB-tree红黑树中,可以看出红黑树的插入.查找.删除的平均时间复杂度为O(nlogn).但这是基于一个假设:输入数据具有随机性.而哈希表/散列表hash table在插入.删除.查找上具有"平均常数时间复杂度"O(1):且不依赖输入数据的随机性. hash table的实现有线性探测.二次探测.二次散列等实现,SGI的STL是采用开链法(separate chaining)来实现的.大概原理就是在hash table的每一项都是个指针(指向一个链表),叫做bucket.

《STL源码剖析》---stl_alloc.h阅读笔记

这一节是讲空间的配置与释放,但不涉及对象的构造和析构,只是讲解对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本的STL对空间的的申请和释放做了如下考虑: 1.向堆申请空间 2.考虑了多线程.但是这节目的只是讲解空间配置与释放,因此忽略了多线程,集中学习空间的申请和释放. 3.内存不足时的应变措施 4.考虑到了内存碎片的问题.多次申请释放小块内存可能会造成内存碎片. 在C++中,内存的申请和释放是通过operator new函数和operator delete函数,这两个函数相当于C语

《STL源码剖析》---stl_multiset.h阅读笔记

STL中的set不允许键值重复,因此就有了multiset.multiset和set操作一样,功能一样,但是multiset允许键值重复,在使用红黑树的插入操作是,用的是insert_equal,而set用的是insert_unique,其他代码一样. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_multiset.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permi