我是Nodejs的新手,我有一个关于EventEmitter的listenerCount()方法的问题,还有一个关于调用静态方法的一般方法的问题。
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来调用它是否有实际的原因,以及在原始代码和我的更改中调用的方式是否有(或可能有)任何不同?
发布于 2016-12-24 06:38:14
至少从NodeV4.0.0开始,你实际上可以直接使用emitter.listenerCount()。
至于额外的require(),它是不需要的,你可以按照你的建议去做(events.EventEmitter.listenerCount())。
发布于 2016-12-24 06:38:46
它不是一个类。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);https://stackoverflow.com/questions/41308361
复制相似问题