2016-12-23 6 views
1

Я новичок в Nodejs, и у меня есть вопрос о методе EventEmitterlistenerCount(), но также и способе вызова статических методов в целом. Это пример кода из Nodejs учебника TutorialsPoint на эмиттере события:«Статические методы» EventEmitter()

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 для каждого из этих вызовов и существует (или может быть) какая-либо разница в поведении способов вызовов были сделаны в исходном коде и мои изменения?

ответ

1

FWIW вы может фактически использовать emitter.listenerCount() непосредственно, поскольку хотя бы узел v4.0.0.

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

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); 
Смежные вопросы