10

パフォーマンス

オブジェクト構成を使用するのではなく、プロトタイプの継承チェーンを構築するのはなぜですか。チェーンの各ステップのプロトタイプを調べると、コストがかかります。

ダミーのコード例を次に示します。

var lower  = {
    "foo": "bar"
};

var upper = {
    "bar": "foo"
};

var chained = Object.create(lower,  pd(upper));

var chainedPrototype = Object.create(chained);

var combinedPrototype = Object.create(pd.merge(lower, upper));

var o1 = Object.create(chainedPrototypes);
var o2 = Object.create(combinedPrototypes);

pdプロパティ記述子は地獄のように冗長であるため、使用します。

o2.fooo1.foo3つではなく2つのプロトタイプチェーンしか上がらないため、より高速です。

プロトタイプ チェーンをたどるとコストがかかるのに、なぜオブジェクト構成を使用する代わりにプロトタイプ チェーンを構築するのでしょうか?

別のより良い例は次のとおりです。

var Element = {
  // Element methods
}

var Node = {
  // Node methods
}

var setUpChain = Object.create(Element, pd(Node));
var chained = Object.create(setUpChain);
var combined = Object.create(pd.merge(Node, Element));

document.createChainedElement = function() {
  return Object.create(chained);
}

document.createCombinedElement = function() {
  return Object.create(combined);
}

効率のためにプロトタイプ オブジェクトをマージするコードは見当たりません。連鎖プロトタイプを構築するコードをたくさん目にします。なぜ後者がより人気があるのですか?

考えられる唯一の理由はObject.isPrototypeOf、チェーン内の個々のプロトタイプをテストするために を使用することです。

構成よりisPrototypeOfも継承を使用することには明らかな利点がありますか?

4

3 に答える 3

4

主な理由は、プロトタイプ オブジェクトへの変更である必要があります。祖先オブジェクトへの変更は、チェーン全体に反映されます。これは、おそらく、利点になる可能性があります。現実世界のインスタンスをすぐに思いつくことはできませんが、この動的な性質を受け入れることで、他の (つまりクラスベースの) 言語では提供されない動的な機能が提供される可能性があると思います。

プロトタイプ チェーンのさらに上のオブジェクトは、アプリケーションの存続期間にわたって必要に応じて進化する可能性があり、それらの変更はすべての子孫オブジェクトに反映されます。これは、必要に応じて機能を動的に変更するための第一級オブジェクトとして、JavaScript の関数と簡単に組み合わせることができます。

とはいえ、この機能が必要ない場合は、合成よりもプロトタイプ チェーンを使用する理由はありません。

于 2011-09-03T16:25:54.313 に答える
0

lowerさて、またはupper変更された場合に何が起こるかを考えてみましょう。プロパティをコピーして新しいオブジェクトを作成したため、結合されたプロトタイプにはその変更が反映されません。

多くの状況では問題ありませんが、実際にオブジェクトの適切なプロトタイプ チェーンを構築するほど動的ではないことは確かです。

于 2011-09-03T16:28:23.290 に答える
0

以下に、私が考えることができるいくつかの利点を、重要度順に示します。

メモリ使用量

プロトタイプを使用して、共有プロパティを作成します。あなたのアプローチは、すべての値を各オブジェクトにコピーします。

オブジェクト設定の初期費用

後で少し時間を節約できるとは思いますが、オブジェクトを設定するときにプロパティをコピーするコストが発生します。パフォーマンス テストでそれを考慮していただければ幸いです。これは、オブジェクトをセットアップするよりも多くのことを読み取る場合に勝る利点です。

インスタンスの

優れたコードは instanceOf を使用しませんが、すべてのコードを完璧にすることはできない場合があるため、言語機能を壊す必要はありません。

プロトタイプの動的変更

ほとんどの人は (私のように) これは必要ないと主張しますが、多くの人はいくつかの配列をインスタンス化した後に Array.prototype を拡張しています (そうすべきではない)。コピー プロパティ アプローチでは、元のオブジェクトへの参照が失われます。

恥ずかしがらないプラグイン: http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

最後の注意これが実際にアプリのボトルネックである場合、問題のオブジェクトに使用することを躊躇しません

于 2013-02-01T18:27:49.217 に答える