Node.js与new运算符的调用之间的区别

时间:2015-04-30 00:16:39

标签: javascript node.js

为什么这两个变量(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)();

有人可以解释为什么会这样吗?

2 个答案:

答案 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)

更新

这里有两件事。

1。使用EventEmitter API

我想你问为什么ee1 !== ee2使用API​​。

它们是不同的,因为API让你创建任意数量的EventEmitter。

这让你有一个EventEmitter用于多个套接字,流,数据库连接或任何你需要的东西。

您可以将new EventEmitter()视为工厂加盖EventEmitter

2。如果您询问此特定代码,则第二版中存在错误。

该错误归因于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);