ответ

4

Ваш второй пример не вызывает EventEmitter. emitter заканчивается ссылкой на функцию, а не на объект, созданный при вызове.

Если вы имели в виду, чтобы () на что:

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

против

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

Тогда есть два отличия:

  1. У вас есть events объект со ссылкой на события модуль.

  2. Вы не использовали new при звонке EventEmitter.

Если в результате emitter идентична, то да, это означает, что EventEmitter преднамеренно делает new необязательным. I don't see that in the docs, поэтому я не знаю, что я бы положился на это.


... или EventEmitter довольно снисходителен в использовании/не используется new и ()?

Последняя часть, которая предполагает, что Вы уже использовали третий вариант:

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

() Having необязательно есть не то, что делает 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, скобка не является обязательной. Но во всем мире вам нужно использовать (...) для выполнения функции.