、例えば:しかしは私が持つEventEmitterする既存のオブジェクトを設定したい既存のオブジェクト
var emitter = {};
EventEmitter.call(emitter);
console.log(emitter.on);
に持つEventEmitterを呼び出す方法を、emitter.onではなく関数であると、定義されていません。
、例えば:しかしは私が持つEventEmitterする既存のオブジェクトを設定したい既存のオブジェクト
var emitter = {};
EventEmitter.call(emitter);
console.log(emitter.on);
に持つEventEmitterを呼び出す方法を、emitter.onではなく関数であると、定義されていません。
これを行う最も簡単な方法は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)
は私はわかりません。そのステートメントは、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;
次の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");