2

関数のプロトタイプを別の関数に追加するにはどうすればよいですか?何かのようなもの:

// Foo
function foo(){};
foo.prototype.a = 'hello';

// Bar
function bar(){}
bar.prototype.b = 'world';

// Append Foo's prototype to Bar
bar.appendPrototype(foo);

// Print
console.log(bar.prototype) // -> { a: 'hello', b: 'world' }
4

2 に答える 2

6

ソースプロトタイプの小道具を繰り返し、それぞれを宛先のプロトタイプに追加できます。これは、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 = newEventEmitter()のように. Then, to access the emitter, rather thanthis.emit(...), you would dothis.emitter.emit(...)`。それも機能しますが、多くの場合、それほど便利でも簡潔でもありません。

于 2013-01-06T02:10:37.327 に答える
0

簡単です。

function foo(){};
foo.prototype.a =2;

function bar(){
    foo.call(this,null);
}
bar.prototype.b=4;
console.log(bar.prototype); //{a:2,b:4}
于 2013-01-06T02:24:18.630 に答える