0

Node.jsではなくjavascriptでの継承に少し特有の質問があります:

// foo.js
var events = require('events');
var util = require('util');

var Foo = (function(){
    var foo = {};
    events.EventEmitter.call(foo);
    foo.init = function(){
        foo.emit('bar');
    };

    util.inherits(parser, events.EventEmitter);

    return { 
        bind: foo.init,
        on: foo.on // I suppose this resolves to event emitter's on method
    };

}());

module.exports = Foo;

次に、単に呼び出そうとすると(main.jsで言う):

var foo = require('./foo.js');

foo.on('bar', function(){ ... });

呼び出す前にエラーが生成されますfoo.init();

foo.on('bar', function(){ ... })
       ^
TypeError: Property 'on' of object #<Object> is not a function

IIFE パターンでコーディングすることを選択した場合、EventEmitter から継承することはできませんか? または、私のエラーは何か他のものに関連していますか?

4

2 に答える 2

2

モジュール パターンを使用して EventEmitter のように動作するオブジェクトが必要な場合は、次のようにします。

var foo = function () {

  var ee = new EventEmitter();

  /* custom logic */

  return {
    on: ee.on.bind(ee),
    emit: ee.emit.bind(ee),
  }

};
于 2013-07-20T23:05:51.920 に答える
2

このパターンを維持したい場合で、次のようなプロトタイプの継承を使用しない正当な理由がある場合:

FooConstuctor.prototype = new events.EventEmitter();

次に、 EventEmitterから必要なのはonメソッドだけである場合は、以下を追加するだけです。

Foo.on = events.EventEmitter.prototype.on;

Fooを作成した直後。

onメソッドはコンストラクター内のEventEmitterオブジェクトにアタッチされていないため、FooでEventEmitterのコンストラクターを呼び出すだけでは、 Fooで onメソッドを取得できません。

その理由はおそらく、コンストラクターでオブジェクトにメソッドを割り当てることは通常悪い習慣と見なされているためです。これは、オブジェクトインスタンスごとに新しい関数インスタンスが作成されるため、通常は不要で無駄が多く、このように作成されたメソッドはそうではないためです。これは、「クラス」の拡張を計画している他の開発者にとって誤解を招く可能性があります。

于 2013-07-20T21:14:15.390 に答える