1

同様の機能を備えたモジュールを作成しているときに見逃していた可能性のあることを学ぶことを期待して、いくつかのNode.jsモジュールを調べてきました。それから私はハウンドからこのコードに出くわしました:

function Hound() {
    //why this?
    events.EventEmitter.call(this)
}

//ok, so inheriting the EventEmitter
util.inherits(Hound, events.EventEmitter);

ドキュメントに記載されているように、util.inherits() Node.jsの関数が子コンストラクターのプロトタイプとして新しい親インスタンスを作成することを知っています。

コンストラクターのプロトタイプは、superConstructorから作成された新しいオブジェクトに設定されます。

では、コンストラクターがを継承EventEmitterしている場合、コンストラクターutil.inherits()内のそのコードは何のためにあるのでしょうか。

4

2 に答える 2

1

HoundクラスをEventEmitterオブジェクトにするだけです。

これにより、EventEmitterインスタンスメソッドがクラスに提供されます。

例えば、houndInstance.emit('something')

これらのイベントをリッスンしている他のオブジェクトは、それらに応答できます。


あなたのコメントによると:

// constructor
function Hound() {

    // equivalent of calling a "super" or "parent" constructor
    SomeClass.call(this);
}

JavaScriptでは、.call(context)は特定のコンテキストで関数を呼び出す手段です。上記の例では、コンストラクターを呼び出して、コンテキストとして(この例ではクラス)SomeClassを渡しているだけです。thisHound

于 2012-12-06T05:51:47.927 に答える
1

あなたのコメントから:

しかし、util.inherits()はすでにそれをカバーしていませんか?それとも私は何かが足りないのですか?

欠落しているのは、util.inherits()単に親オブジェクトを継承することです。親オブジェクトのコンストラクターを自動的に呼び出すようにコンストラクターを設定することはありません。ほとんどの場合、ほとんどのオブジェクトはコンストラクターで多くの初期化を行わないため、これで十分です。

しかし、events.EventEmitter明らかに、いくつかの重要な副作用があるコンストラクターでいくつかの初期化を行います。プロトタイプの継承は親のコンストラクターを自動的に呼び出さないため、この場合は手動で呼び出す必要があります。したがって、events.EventEmitter.call(this)ライン。


別の方法は、常に親のコンストラクターを呼び出すモジュールパターンを使用することです。これは、モジュールパターン自体が継承ではなく、ミックスイン/デコレータパターンを悪用して継承をエミュレートするためです。親コンストラクタからオブジェクトを作成し、手動で属性を追加します。多くの人は、モジュールパターンが機能を複製して属性を付けるため、モジュールパターンを嫌います。したがって、モジュールパターンはメモリを浪費していると見なされます。また、それは適切な継承ではないので、のようなものを壊しinstanceofます。

于 2012-12-06T07:08:07.450 に答える