我是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.");
它会调用listenerCount()
"类"上的events
方法。 (它是一个类?)通过再次要求事件。我指的是它所说的部分:
var eventListeners = require('events').EventEmitter.listenerCount
(eventEmitter,'connection')
listenerCount()
本质上是一种静态方法,因为你不能直接在events
对象上调用它。
(我也不太明白为什么实现是这样的,为什么不实现它以便我可以在我的eventEmitter
对象上调用它,例如:{{1 }})
但无论如何,我接下来试过的是在我的eventEmitter.listenerCount('connection')
对象上调用这个静态方法,而没有额外的events
调用(在这个代码中的两个实例上),所以它看起来像像这样:
require
程序的输出是一样的。
所以我的问题是,是否有一个实际的原因,作者通过为每个调用创建一个新的events.EventEmitter.listenerCount(eventEmitter, "connection");
来调用它,并且是否存在(或可能存在)行为的任何差异在原始代码中调用的方式,以及我的更改?
答案 0 :(得分:1)
您可以直接实际使用emitter.listenerCount()
,至少从节点v4.0.0开始。
对于额外的require()
,不需要它,您可以按照建议(events.EventEmitter.listenerCount()
)进行操作。
答案 1 :(得分:1)
这不是一个班级。 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);