Javascript &引用;“静态方法”;EventEmitter()的
我是Nodejs新手,我对Javascript &引用;“静态方法”;EventEmitter()的,javascript,node.js,eventemitter,Javascript,Node.js,Eventemitter,我是Nodejs新手,我对EventEmitter的listenerCount()方法有一个问题,但也有一个关于调用静态方法的问题。这是TutorialsPoint关于事件发射器的Nodejs教程中的示例代码: var events = require('events'); var eventEmitter = new events.EventEmitter(); // listener #1 var listner1 = function listner1() { console.lo
EventEmitter
的listenerCount()
方法有一个问题,但也有一个关于调用静态方法的问题。这是TutorialsPoint关于事件发射器的Nodejs教程中的示例代码:
var events = require('events');
var eventEmitter = new events.EventEmitter();
// listener #1
var listner1 = function listner1() {
console.log('listner1 executed.');
}
// listener #2
var listner2 = function listner2() {
console.log('listner2 executed.');
}
// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);
// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);
var eventListeners = require('events').EventEmitter.listenerCount
(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");
// Fire the connection event
eventEmitter.emit('connection');
// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");
// Fire the connection event
eventEmitter.emit('connection');
eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");
console.log("Program Ended.");
它通过再次要求事件来调用events
上的listenerCount()
方法“class”(它是一个类吗?)。我指的是它说:
var eventListeners=require('events')。EventEmitter.listenerCount
(eventEmitter,'connection')
listenerCount()
本质上是一个静态方法,因为您不能直接在events
对象上调用它
(我也不太明白为什么实现是这样的,为什么不实现它以便我可以在我的eventEmitter
对象上调用它,例如:eventEmitter.listenerCount('connection')
)
但无论哪种方式,我随后尝试的是在我的事件
对象上调用这个静态方法,而不需要额外的require
调用(在这段代码中的两个实例上),因此它看起来像这样:
events.EventEmitter.listenerCount(EventEmitter,“连接”)代码>
程序的输出是一样的
因此,我的问题是,作者之所以调用它,是因为为每个调用都创建了一个新的require
,并且在原始代码中调用的方式和我的修改中有(或者可能有)任何不同吗?FWIW您实际上可以使用emitter.listenerCount()
至少从节点v4.0.0直接开始
至于额外的require()
,它是不需要的,您可以按照您的建议执行(events.EventEmitter.listenerCount()
)。它不是一个类。JavaScript中没有类。ES6中有一个class
关键字,但它是对象和原型的语法糖
由于这个原因,JavaScript中的静态方法和实例方法实际上没有区别,因为每个方法都是实例方法。不能对对象以外的任何对象调用方法。而EventEmitter
是一个对象,但它也是其他对象的构造函数
此外,这:
var x = require('module').a.b();
同:
var module = require('module');
x = module.a.b();
这不仅仅是相同的结果,实际上是相同的对象-每个必需的模块只计算一次并缓存,并且相同模块的每个必需都提供相同的对象
您甚至可以通过这种方式在模块之间传递数据
require('module').x = 1;
console.log(require('module').x);