为什么
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;
}
答案 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