3

为什么

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;
}
4

2 回答 2

7

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

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

在上述情况下,require('events');将返回Object包含EventEmitter,但require('events').EventEmitter会返回您可能对实例化感兴趣的实际 EventEmitter 函数。

认为 API 设计者确实可以直接导出 EventEmitter 函数会很好,module.exports = function () { ... };但是,他们决定为“事件”模块的其他可能有用的属性留出空间。

编辑

关于https://github.com/joyent/node/blob/master/lib/events.jsmodule.exports = EventEmitter; ,您可以在以下几行中找到:

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

我想从 0.11 版开始你可以运行var Emitter = require('events');,但在 0.10.x 中你被卡住了require('events').EventEmitter

于 2014-02-04T16:10:05.920 回答
1

require准确返回您放入module.exports对象的内容。所以如果你有module.exports = Currency;然后require返回Currency,如果你有exports.Currency = Currency require将返回{ Currency : Currency }对象。

如果您希望这两种方式都有效,请执行Currency.Currency = Currency; module.exports = Currency. 在最新的节点版本中,他们这样做EventEmitter

于 2014-02-04T16:13:20.963 回答