2016-12-23 13 views
1

私はNodejsを初めて使用しています。EventEmitterlistenerCount()メソッドに関する質問がありますが、一般的に静的メソッドを呼び出す方法もあります。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."); 

は、それが再びイベントを必要とすることによってevents「クラス」(?それはクラスである)にlistenerCount()メソッドを呼び出します。これは、イベント・エミッターのTutorialsPointのNodejsチュートリアルからのサンプルコードです。あなたが直接eventsオブジェクト上でそれを呼び出すことはできませんので、

var eventListeners = require('events').EventEmitter.listenerCount (eventEmitter,'connection')

listenerCount()は、私が思う、基本的に静的メソッドである:私はそれを言うの部分に言及しています。

(私は実装がそのようである理由もかなり理解していない、と私のような、私のeventEmitterオブジェクト上でそれを呼び出すことができるように、なぜそれが実装されない:eventEmitter.listenerCount('connection')

しかし、いずれにせよ、私は、試してみました何、それはこのように見えたように、(このコードでは、両方のインスタンス上の)追加requireコールせずに、私のeventsオブジェクトにこの静的メソッドを呼び出すことです:

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); 
関連する問題