var events = require('events'),
emitter = new events.EventEmitter();
和
var emitter = require('events').EventEmitter;
或EventEmitter
之间的区别是使用相当宽容/不使用new
和()
?
var events = require('events'),
emitter = new events.EventEmitter();
和
var emitter = require('events').EventEmitter;
或EventEmitter
之间的区别是使用相当宽容/不使用new
和()
?
你的第二个例子根本不叫EventEmitter
。 emitter
最终是对函数的引用,而不是通过调用它创建的对象。
如果你的意思是有对()
:
var events = require('events'),
emitter = new events.EventEmitter();
VS
var emitter = require('events').EventEmitter();
// Note ------------------------------------^^
然后有两点不同:
你有一个events
对象指的是事件模块。
致电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
总是调用你给它的函数,不管有没有()
。
您可以自己看到区别,
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
,括号是可选的。但是在其他地方,您需要使用(...)
来执行该功能。