【问题标题】:Node.js difference between calls with new operatorNode.js 与 new 运算符的调用之间的区别
【发布时间】:2015-04-30 00:16:38
【问题描述】:

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

谁能解释这是为什么?

【问题讨论】:

  • var ee = new (require('events').EventEmitter)(); 怎么样?
  • ({a: 1}) == ({a: 1}); // false
  • @jfriend00 是的,打电话给你写的作品

标签: javascript node.js


【解决方案1】:

更新

这里有两件事。

1。使用 EventEmitter API

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

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

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

您可以将new EventEmitter() 视为工厂淘汰EventEmitter's

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);

【讨论】:

    【解决方案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 is not a function

    【讨论】:

    • 括号内不添加任何内容 new (require('events')).EventEmitternew require('events').EventEmitter 相同,因为运算符优先级。
    猜你喜欢
    • 2011-05-24
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2011-10-22
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多