1

是什么使用`new`和`()`有需要

var events = require('events'), 
    emitter = new events.EventEmitter(); 

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

EventEmitter之间的区别是使用相当宽容/不使用new()

回答

4

你的第二个例子根本不叫EventEmitteremitter最终是对函数的引用,而不是通过调用它创建的对象。

如果你的意思是有对()

var events = require('events'), 
    emitter = new events.EventEmitter(); 

VS

var emitter = require('events').EventEmitter(); 
// Note ------------------------------------^^ 

然后有两点不同:

  1. 你有一个events对象指的是事件模块。

  2. 致电EventEmitter时,您没有使用new

如果得到的是emitter相同,那么,就意味着EventEmitter故意使new可选的。我don't see that in the docs,所以我不知道我会依赖它。


...或EventEmitter在使用/不使用new()相当宽容?

的那最后部分意味着你已经使用了第三个选项:

var emitter = new require('events').EventEmitter; 
// `new` -----^ but no() --------------------^ 

()可选没有什么EventEmitter做;它是这样做的JavaScript new运算符:如果没有参数传递给构造函数,()new表达式中是可选的。 new总是调用你给它的函数,不管有没有()

2

您可以自己看到区别,

var events = require('events'), 
    emitter = new events.EventEmitter(); 

console.log(typeof emitter); 
// object 

但是当你做这样的事情

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

console.log(typeof emitter); 
// function 

在第一种情况下,要调用的EventEmitter构造函数来得到一个对象,但在第二种情况下,您只是简单地将emitter作为EventEmitter函数本身的参考。

new部分而言,它对一个函数对象进行操作。由于您没有参数传递给EventEmitter,括号是可选的。但是在其他地方,您需要使用(...)来执行该功能。

相关问题