首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventEmitter()的“静态方法”

EventEmitter()的“静态方法”
EN

Stack Overflow用户
提问于 2016-12-24 06:10:21
回答 2查看 963关注 0票数 1

我是Nodejs的新手,我有一个关于EventEmitterlistenerCount()方法的问题,还有一个关于调用静态方法的一般方法的问题。

代码语言:javascript
复制
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来调用它是否有实际的原因,以及在原始代码和我的更改中调用的方式是否有(或可能有)任何不同?

EN

回答 2

Stack Overflow用户

发布于 2016-12-24 06:38:14

至少从NodeV4.0.0开始,你实际上可以直接使用emitter.listenerCount()

至于额外的require(),它是不需要的,你可以按照你的建议去做(events.EventEmitter.listenerCount())。

票数 1
EN

Stack Overflow用户

发布于 2016-12-24 06:38:46

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

因此,在JavaScript中实际上没有区分静态方法和实例方法,因为每个方法都是一个实例方法。除了对象之外,不能对任何其他对象调用方法。EventEmitter是一个对象,但它也是其他对象的构造函数。

此外,还有以下内容:

代码语言:javascript
复制
var x = require('module').a.b();

与以下内容相同:

代码语言:javascript
复制
var module = require('module');
x = module.a.b();

它不仅是相同的结果,而且实际上是相同的对象-每个必需的模块只评估一次并缓存,并且相同模块的每个请求都提供相同的对象。

您甚至可以通过这种方式在模块之间传递数据。

代码语言:javascript
复制
require('module').x = 1;
console.log(require('module').x);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41308361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档