ソースプロトタイプの小道具を繰り返し、それぞれを宛先のプロトタイプに追加できます。これは、srcプロトタイプのプロパティが、コピー可能な単純なプロパティ(オブジェクト自体ではなく、関数や単純な値など)であることを前提としています。これは通常の場合です。ネストされたオブジェクト自体であるプロトタイププロパティを許可する場合は、各プロパティのクローンを作成する必要があります。通常、これは必須ではないため、より単純なバージョンを次に示します。
bar.appendPrototype = function(src) {
for (var prop in src.prototype) {
this.prototype[prop] = src.prototype[prop];
}
}
bar.appendPrototype(foo);
プロトタイプは単なるオブジェクトであるため、あるプロトタイプのプロパティを別のプロトタイプにコピーするだけです。
数年後に更新します。 あるプロトタイプから別のプロトタイプにメソッドをコピーするというこの一般的な概念は、一般に「ミックスイン」と呼ばれるものを作成します。この場合、あるクラスのメソッドを別のクラスにミックスして、両方のオブジェクトの機能を備えた新しいオブジェクトを作成します。これは、説明に役立つトピックに関する興味深い記事です。
ミックスインの実装Object.assign()
では、独自のループを作成するのではなく、1つの関数呼び出しで1つのオブジェクトから別のオブジェクトにプロパティをコピーするために使用できるようになりました。
ES6class
構文で以前に宣言されたクラスでミックスインを実行することもできます。
ミックスインのかなり一般的な例は、すでにクラス階層があり(したがって、継承することはできない)、リーフクラスもでありeventEmitter
、そのエミッターのすべての機能を備えている場合です。EventEmitterオブジェクトを「ミックスイン」することができ、以前に宣言されたクラスにも。の機能がありEventEmitter
ます。(サブクラス化の場合と同じように)注意する必要があるのは、ミックスインコードとコードの両方が同じコアインスタンスオブジェクトにアクセスするため、2つのオブジェクト実装間でインスタンスプロパティ名が競合しないようにする必要があることです。
上記の例のミックスインの代わりに、リーフクラスのインスタンスデータに個別のEventEmitterオブジェクトを追加するだけです。this.emitter = new
EventEmitter()のように. Then, to access the emitter, rather than
this.emit(...), you would do
this.emitter.emit(...)`。それも機能しますが、多くの場合、それほど便利でも簡潔でもありません。