之间有什么区别
var events = require('events'),
emitter = new events.EventEmitter();
和
var emitter = require('events').EventEmitter;
或者CCD_ 1在使用/不使用CCD_ 2和CCD_?
您的第二个示例根本不调用EventEmitter
。emitter
最终是对函数的引用,而不是通过调用它创建的对象
如果你想在上面放()
:
var events = require('events'),
emitter = new events.EventEmitter();
与
var emitter = require('events').EventEmitter();
// Note ------------------------------------^^
然后有两个区别:
您有一个引用事件模块的
events
对象。您在呼叫
EventEmitter
时未使用new
。
如果得到的EventEmitter
0相同,那么是的,这意味着EventEmitter
有意使new
可选。我在文档中没有看到这一点,所以我不知道我会依赖它。
或者
EventEmitter
在使用/不使用new
和()
方面相当宽容?
最后一部分建议您使用第三个选项:
var emitter = new require('events').EventEmitter;
// `new` -----^ but no () --------------------^
()
是可选的,EventEmitter
没有什么作用;是JavaScriptnew
运算符在执行此操作:如果没有要传递给构造函数的参数,那么()
在new
0表达式中是可选的。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
的参数,因此括号是可选的。但在其他任何地方,都需要使用(...)
来执行该函数。