2017-12-20 9 views

答えて

0

これを行う最も簡単な方法はES6 Class syntax via the class keywordを使用し、extendsキーワードを使用してEventEmitterのサブクラスを作成することです。以下は、Prototypal Inheritanceを使用して自分自身をEventEmitterにする簡単な例です。

EventEmitter.call(emitter); 

が魔法のようにすべて持つEventEmitterの機能を使用してエミッタオブジェクトに力を与えるでしょう:あなたはという考えを持ってどこ

// MyEmitter.js 
const EventEmitter = require('events') 

class MyEmitter extends EventEmitter { 
    constructor() { 
    super() 
    this.emit('created', 'New Instance of MyEmitter Created') 
    } 
} 

module.exports = MyEmitter 

// index.js 
const MyEmitter = require('./MyEmitter') 

// Create a new instance of MyEmitter 
const emitter = new MyEmitter() 

// Attach an Event Listener for the 'created' event 
// Print whatever the message is to stdout 
emitter.on('created', message => console.log) 
1

は私はわかりません。そのステートメントは、EventEmitterコンストラクタを呼び出してオブジェクトにthis引数として渡します。これによりコンストラクタが実行され、おそらくemitterオブジェクトのデータが設定されますが、EventEmitterプロトタイプがオブジェクトにアタッチされないため、EventEmitterプロトタイプのメソッドはオブジェクトにバインドされないため、.on()undefined


既存のオブジェクトの機能を制御することができ、達成しようとしていることに応じて、複数の方法があります。

EventEmitterにするオブジェクトの定義を制御する場合は、EventEmitterオブジェクトから継承したいだけで、オブジェクトは「EventEmitter」になり、すべてのメソッドとデータ。あなたは、そのオブジェクトの定義や構築を制御しない場合

const MyObj = require("myobj.js"); 
let obj = new MyObj(); 
obj.on("hello", data => { 
    console.log("got hello message"); 
}); 

obj.emit("hello", "to you"); 

:ES6クラスの構文と

継承:次に

// myobj.js 
const EventEmitter = require('events'); 

// inherit directly from EventEmitter 
class MyObj extends EventEmitter { 
    constructor() { 
    super() 
    } 
    // your other custom methods here 
} 

module.exports = MyObj; 

、あなたはこのようにそれを使用しますEventEmitterロジックを与えたい場合は、EventEmitterになるかどうかを決定する必要があります。

"be a"パス(オブジェクトに "EventEmitter"に独自の機能を追加する場合は、EventEmitterオブジェクトのロジックをミックスし、すべてのメソッドとデータを独自のオブジェクトに追加しますあなた自身のオブジェクトが作成された後でも、これは絶対確実ではありません。いくつかのタイプのオブジェクトは、混在することができないプライベートデータに依存するかもしれないので、多くのオブジェクトで機能します。

EventEmitterの場合、あなたが "mixin"とEventEmitterを可能にするために作られたモジュールです。それはcomponent-emitter on NPMと呼ばれ、とても使いやすいです。ソケットオブジェクトはEventEmitterになるようにright hereを使用します。パス「持っている」、あなたは、単にEventEmitterオブジェクトを作成し、独自のオブジェクトのインスタンスデータに入れて、あなたのEventEmitter機能のためにその特定のオブジェクトを参照してください

var Emitter = require('component-emitter'); 

/** 
* Mix in `Emitter`. 
*/ 

Emitter(Socket.prototype); 

。そのオブジェクトを手動で取得して使用することも、自動的に使用するメソッドを持つこともできます。これは実装するのが簡単で簡単ですが、場合によっては使用するのに便利ではありません(本当にあなたがしようとしていることの詳細に依存しています)。

class MyObj { 
    constructor() { 
    super() 
    this.myEmitter = new EventEmitter(); 
    } 
    // your other custom methods here 
    broadcast(msg, data) { 
     // use the internal eventEmitter object we have in our instance data 
     this.myEmitter.emit(msg, data); 
    } 
} 

module.exports = MyObj; 
0

次の2つの方法でこの問題を解決することができ、あなたがEventEmitterクラスを拡張したり、EventEmitterのプロトタイプにemitterのプロトタイプを設定するのいずれかです。

// using es6 class 

class MyEmitter extends EventEmitter { 
    constructor() { 
     super(); 
    } 
} 

const emitter = new MyEmitter(); 

emitter.on("greet", greet => console.log(greet)); 

emitter.emit("greet", "hello"); 

// if you want to use this on a different file you have to export the emitter object 



// the second alternative if you don't want to use a class 

const emitter = {}; 

Object.setPrototypeOf(emitter, events.prototype); 

// or 

Object.setPrototypeOf(emitter, events.EventEmitter.prototype); 

emitter.on("greet", greet => console.log(greet)); 

emitter.emit("greet", "hello"); 
関連する問題