Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;“静态方法”;EventEmitter()的_Javascript_Node.js_Eventemitter - Fatal编程技术网

Javascript &引用;“静态方法”;EventEmitter()的

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

我是Nodejs新手,我对
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);