EventEmitter()的“静态方法”

我是Nodejs的新手,我对EventEmitterlistenerCount()方法有一个疑问,也是一般调用静态方法的方法。 这是来自事件发布器上的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()方法。 我指的是它所说的部分:

var eventListeners = require('events').EventEmitter.listenerCount (eventEmitter,'connection')

listenerCount()本质上是一个静态方法,我想,因为你不能直接在events对象上调用它。

(我也不太明白为什么实现是这样的,为什么不实现,以便我可以调用它在我eventEmitter对象,如: eventEmitter.listenerCount('connection')

但无论哪种方式,我已经尝试过,是在我的events对象上调用这个静态方法,没有额外的require调用(在这个代码中的两个实例),所以看起来像这样:

events.EventEmitter.listenerCount(eventEmitter, "connection");

而程序的输出是一样的。

所以我的问题是,作者是否有这样一个实际的理由:对每一个这样的调用提出一个新的require ,并且在那个调用的方式的行为中是否存在(或者可能存在)原代码和我的改动?

FWIW你至less可以直接使用emitter.listenerCount() ,因为至less是节点v4.0.0。

至于额外的require() ,这是不需要的,你可以做你有什么build议( events.EventEmitter.listenerCount() )。

这不是一个阶级。 JavaScript中没有类。 在ES6中有一个class关键字,但它是对象和原型的语法糖。

由于这个原因,JavaScript中的静态和实例方法之间确实没有区别,因为每个方法都是一个实例方法。 除了对象之外,您不能调用任何其他方法。 EventEmitter是一个对象,但它也是其他对象的构造函数。

另外,这个:

 var x = require('module').ab(); 

是相同的:

 var module = require('module'); x = module.ab(); 

这不仅仅是相同的结果,实际上是相同的对象 – 每个需要的模块只被计算一次并被caching,并且相同模块的每个需求都给出相同的对象。

你甚至可以在模块之间传递数据。

 require('module').x = 1; console.log(require('module').x);