Статические методы 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 объекте, например: eventEmitter.listenerCount('connection'))

Но в любом случае, что я потом пробовал, так это вызвать этот статический метод для моего объекта events без дополнительного вызова require (для обоих экземпляров в этом коде), чтобы он выглядел так:

events.EventEmitter.listenerCount(eventEmitter, "connection");

И вывод программы был таким же.

Итак, мой вопрос по этому поводу заключается в том, есть ли реальная причина, по которой автор назвал это, сделав новый require для каждого из этих вызовов, и есть ли (или может ли быть) какая-либо разница в поведении того, как вызовы были сделаны в исходный код и моя переделка?


person Digital Ninja    schedule 23.12.2016    source источник


Ответы (2)


Между прочим, вы можете использовать emitter.listenerCount() напрямую, начиная как минимум с версии Node 4.0.0.

Что касается дополнительного require(), то он не нужен и вы можете сделать то, что вы предложили (events.EventEmitter.listenerCount()).

person mscdex    schedule 23.12.2016

Это не класс. В 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);
person rsp    schedule 23.12.2016