0

node.jsで行っている作業用のコンストラクター関数を作成したいと思います。特に、イベントエミッターを使用して作成されたインスタンスの数をログに記録したいと思います。現時点では、コンストラクターオブジェクトにイベントエミッターであるメソッドを与えることでこれを行っています。例えば:

var EventEmitter = require('events').EventEmitter;

function MyObject() {
    ...
    MyObject.events.emit('createdMyObject')
}

MyObject.events = new EventEmitter();

/* somewhere else... */

MyObject.events.on('createdMyObject', function () {
    // Do something when a new instance is created.
});

私が本当に望んでいるのは、コンストラクターがイベントをより直接的に発行することです。そのため、次のようなものでイベントをリッスンできます。

MyObject.on('createdMyObject', function () {
    // Do something when a new instance is created.
});

これを行う方法はありますか?

インスタンスがイベントエミッターである必要はないことに注意してください(グーグルで検索すると、この例がたくさんあります)。他のオブジェクト指向言語の用語では、クラスメソッドと同等のものが必要です。

4

3 に答える 3

2

にエイリアスevents.onすることはできませんonか?:

// Note: can't use simple function assignment because we need
// the "this" inside on to point to events instead of MyObject

MyObject.on = function (eventType,callback) {
    MyObject.events.on(eventType,callback);
}

MyObjects.events を取り除くわけではなく、イベント ハンドラーを追加するための代替方法を提供するだけです。


追加回答

オブジェクトを本当にイベント エミッターにしたい場合、おそらく EventEmitter オブジェクトから継承したいのではないでしょうか? その場合は、単純に通常の継承を行います。

function MyObject() {
    /*
     * MyObject specific stuff here
     */

    this.emit('createdMyObject');
}

// Now we inherit from an EventEmitter object:
MyObject.prototype = Object.create(EventEmitter.prototype);
于 2012-11-07T07:28:41.847 に答える
1

これは、コンストラクターの非標準の (しかし明らかに非常に一般的に使用されている)__proto__プロパティを使用して解決されます。例えば:

var EventEmitter = require('events').EventEmitter;

MyObj = function (a) {
    this.a = a;
    MyObj.emit('new')
}

MyObj.__proto__ = EventEmitter.prototype;

MyObj.on('new', function () {
    console.log('A new myObj was constructed.');
});

var myObj = new MyObj(1);

期待される{ a: 1 }オブジェクトが作成され、作成イベントによって console.log! がトリガーされます。のようなものを使用して、この動作に対する代替ルートを誰かが提供できる場合Object.create、コンプライアンス上の理由から、それは確かに望ましいことです。

于 2012-11-22T17:29:07.637 に答える
0

これは、イベントエミッターであるオブジェクトを構築する方法の例です

https://github.com/vodolaz095/kabam-kernel/blob/master/index.js#L17

```

var EventEmitter = require('events').EventEmitter,

function KabamKernel(config) {
  EventEmitter.call(this);
  //a lot of code
}
//a lot of code    
util.inherits(KabamKernel, EventEmitter);
//a lot of code

var kernel = new kabamKernel(configOj);
kernel.on('error',console.error); //kernel is an event emmiter!!!

```

于 2013-11-05T07:14:07.387 に答える