Updated
There are two things here.
1. Using the EventEmitter API
I think you're asking why ee1 !== ee2
using the API.
They're different because the API let's you create as many EventEmitter's as you like.
This let's you have an EventEmitter for multiple sockets, streams, db connections, or whatever you need.
You could think of new EventEmitter()
as a factory stamping out EventEmitter
's
2. If you're asking about this specific code, there's a bug in the 2nd version.
The bug is due to JavaScript's Operator Order.
Tl;DR, you need ()
's around the .
for a one-line new
:
var ee4 = new (require('events').EventEmitter);
( . ) <-- do . before new
The issue is that new
and .
have the same precidence so are evaluated left-to-right. That precedence puts it above or below the .
operator after require('events')
.
This code helped me understand better 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);