简体   繁体   English

Node.js与新运算符之间的区别

[英]Node.js difference between calls with new operator

Why are these two variables (1) and (2) not equivalent: 为什么这两个变量(1)和(2)不相等:

    var EventEmitter = require('events').EventEmitter;

(1) var ee = new EventEmitter(); (1) var ee = new EventEmitter();

(2) var ee = new require('events').EventEmitter(); (2) var ee = new require('events').EventEmitter();

variables (1) and (2) are not the same, and I can't figure out why that is. 变量(1)和(2)不相同,我不知道为什么会这样。

However, these two are equivalent (a) and (b): 但是,这两个等价于(a)和(b):

   var EventEmitter = require('events').EventEmitter;

(a) var ee = new EventEmitter(); (a) var ee = new EventEmitter();

(b) var ee = new (require('events').EventEmitter)(); (b) var ee = new (require('events').EventEmitter)();

Could someone explain why this is? 有人可以解释为什么吗?

Updated 更新

There are two things here. 这里有两件事。

1. Using the EventEmitter API 1.使用EventEmitter API

I think you're asking why ee1 !== ee2 using the API. 我想您是在问为什么使用API​​的ee1 !== ee2

They're different because the API let's you create as many EventEmitter's as you like. 它们是不同的,因为API使您可以创建任意数量的EventEmitter。

This let's you have an EventEmitter for multiple sockets, streams, db connections, or whatever you need. 这使您拥有一个用于多个套接字,流,数据库连接或任何您需要的EventEmitter。

You could think of new EventEmitter() as a factory stamping out EventEmitter 's 您可以将new EventEmitter()视为消除EventEmitter的工厂

2. If you're asking about this specific code, there's a bug in the 2nd version. 2.如果您要询问此特定代码,则第二版中存在一个错误。

The bug is due to JavaScript's Operator Order . 该错误是由于JavaScript的Operator Order引起的

Tl;DR, you need () 's around the . Tl; DR,您需要在周围加上() . for a one-line new : 单行new

var ee4 = new (require('events').EventEmitter);
              (                 .            )   <-- do . before new

The issue is that new and . 问题是new. have the same precidence so are evaluated left-to-right. 具有相同的准确性,因此从左到右进行评估。 That precedence puts it above or below the . 该优先级将其置于之上或之下. operator after require('events') . require('events')之后的运算符。

This code helped me understand better node test.js : 这段代码帮助我更好地了解了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);

These two versions are fundamentally different. 这两个版本根本不同。

This one: 这个:

var EventEmitter = require('events').EventEmitter;
var ee = new EventEmitter();

Executes the require, returning the exports of events and then calling the new operator on the results . 执行require,返回事件的导出,然后对结果调用new运算符。

This one: 这个:

var ee = new require('events').EventEmitter;

Invokes require as a constructor. 调用需要作为构造函数。

Look at a more isolated and simple example: 看一个更孤立和简单的例子:

new Date() // creates a new date object new Date() //创建一个新的日期对象

new (Date()) // throws a TypeError: string is not a function new (Date()) //引发TypeError:字符串不是函数

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM