javascript:require('events')。EventEmitter;

时间:2014-02-04 16:04:42

标签: javascript node.js eventemitter

为什么

var EventEmitter = require('events').EventEmitter;
var channel = new EventEmitter();

有效,但

var EventEmitter = require('events');
var channel = new EventEmitter();

不起作用!实际上,我有另一个完全不同的例子,

var Currency = require('./currency)
var Cu = new Currency();

有效,但

var Currency = require('./currency).Currency;
var Cu = new Currency();

不起作用。这是我的currency.js:

function Currency(canadianDollar) {
    this.canadianDollar = canadianDollar;
}

module.exports = Currency;

Currency.prototype.cal = function(amount) {
    return amount * this.canadianDollar;
}

2 个答案:

答案 0 :(得分:6)

因为这是API编写的方式。 “事件”模块的简化示例如下所示:

module.exports = {
    EventEmitter: function () {
        // ...
    }
};

在上述情况下,require('events');会返回包含Object的{​​{1}},但EventEmitter会返回您可能有兴趣实例化的实际EventEmitter函数。

我们很高兴提到API设计师确实可以直接用require('events').EventEmitter导出EventEmitter函数,但是,他们决定为“events”模块的其他潜在有用属性留出空间。

修改

关于https://github.com/joyent/node/blob/master/lib/events.js中的module.exports = function () { ... };,您可以在以下行中找到:

module.exports = EventEmitter;

我认为从版本0.11开始,您可以运行// Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; ,但在0.10.x中,您会遇到var Emitter = require('events');

答案 1 :(得分:1)

require完全返回您放在module.exports对象中的内容。因此,如果您有module.exports = Currency;,则require会返回Currency,如果您有exports.Currency = Currency require,则会返回{ Currency : Currency }个对象。

如果您希望双向工作,请执行Currency.Currency = Currency; module.exports = Currency。在最新的节点版本中,他们使用EventEmitter

这样做