events.EventEmitter.call(this)是必须吗?
发布于 10 年前 作者 PhoenixFeng 12888 次浏览 最后一次编辑是 8 年前
function MyStream() {
    //events.EventEmitter.call(this);//call方法使得MyStream对象继承了EventEmitter对象上的方法
}

util.inherits(MyStream, events.EventEmitter);//使用inherits方法

这是网上流传已久的例子,我想构造函数中的那一句代码是必须的吗?有何作用?我发现我注掉那一行程序也是可以正常运行的~

4 回复

inherited是基与原型的继承,call是基于对象继承,可以获取对象方法

可以看一下 events 模块的源码:

https://github.com/joyent/node/blob/828f14556e0daeae7fdac08fceaa90952de63f73/lib/events.js#L43

EventEmitter 的初始化最初是没有内容的,后来引入 domain 特性时才增加了这个 init

https://github.com/joyent/node/commit/963459d736d6594de641aff4d8767da113359457#diff-4

也就是说,只要没有用到 domain 模块,就可以不用 call 这个 constructor

文档里有讲 domain 对 EventEmitter 的影响: http://nodejs.org/api/domain.html#domain_implicit_binding

谢谢,获益匪浅~

node的domain是捕获最近的错误异常的,以至于不会被冒泡到最顶部而被process.on(‘uncaughtException’)捕获,用于响应500,良好体验,domain.createDomain()的on,once,emit应该是继承与EventEmitter.prototype

回到顶部