"静态方法" of EventEmitter()

时间:2016-12-23 22:10:21

标签: 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.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");来调用它,并且是否存在(或可能存在)行为的任何差异在原始代码中调用的方式,以及我的更改?

2 个答案:

答案 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);