为什么这两个变量(1)和(2)不相等:
var EventEmitter = require('events').EventEmitter;
(1)var ee = new EventEmitter();
(2)var ee = new require('events').EventEmitter();
变量(1)和(2)不一样,我无法弄清楚为什么会这样。
然而,这两个是等价的(a)和(b):
var EventEmitter = require('events').EventEmitter;
(a)var ee = new EventEmitter();
(b)var ee = new (require('events').EventEmitter)();
有人可以解释为什么会这样吗?
答案 0 :(得分:2)
这两个版本根本不同。
这一个:
var EventEmitter = require('events').EventEmitter;
var ee = new EventEmitter();
执行require,返回事件导出,然后在结果上调用new运算符。
这一个:
var ee = new require('events').EventEmitter;
调用require作为构造函数。
看一个更加孤立和简单的例子:
new Date()
//创建一个新的约会对象
new (Date())
//抛出TypeError:string不是函数
答案 1 :(得分:2)
这里有两件事。
我想你问为什么ee1 !== ee2
使用API。
它们是不同的,因为API让你创建任意数量的EventEmitter。
这让你有一个EventEmitter用于多个套接字,流,数据库连接或任何你需要的东西。
您可以将new EventEmitter()
视为工厂加盖EventEmitter
的
该错误归因于JavaScript's Operator Order。
Tl; DR,您需要()
围绕.
获取一行new
:
var ee4 = new (require('events').EventEmitter);
( . ) <-- do . before new
问题是new
和.
具有相同的预测,因此从左到右进行评估。该优先级将其置于.
之后的require('events')
运算符之上或之下。
此代码帮助我更好地理解node test.js
:
var EventEmitter = require('events').EventEmitter;
console.log('require(\'events\').EventEmitter: ' + EventEmitter);
// Works
var ee1 = new EventEmitter;
console.log('ee1: new EventEmitter: ' + ee1);
// Works
var ee1a = new EventEmitter();
console.log('ee1a: new EventEmitter(): ' + ee1a);
// Desn't work. Appears to be the constructor.
var ee2 = new require('events').EventEmitter;
console.log('ee2: new require(\'events\').EventEmitter: ' + ee2);
// Doesn't work. Undefined
var ee3 = new require('events').EventEmitter();
console.log('ee3: new require(\'events\').EventEmitter(): ' + ee3);
// Works. 'one-liner'
var ee4 = new (require('events').EventEmitter);
console.log('ee4: new (require(\'events\').EventEmitter): ' + ee4);
// Works. 'one-liner' with parameters
var ee4a = new (require('events').EventEmitter)();
console.log('ee4: new (require(\'events\').EventEmitter)(): ' + ee4a);
// Doesn't work. Undefined
var ee5 = require('events').EventEmitter();
console.log('ee5: require(\'events\').EventEmitter(): ' + ee5);