__proto__ の変更: パフォーマンスが低下する理由
JavaScript の proto プロパティのドキュメントでは、[[パフォーマンスに悪影響を与えるため、オブジェクトのプロトタイプ]]。これは、Function.prototype にプロパティを追加するのとは対照的に、オブジェクトのプロトタイプを変更することは、最新の JavaScript 実装に重大な影響を与えるためです。
次の例を考えてみましょう。
<code class="javascript">function Foo(){} function bar(){} var foo = new Foo(); // This is bad: //foo.__proto__.bar = bar; // But this is okay Foo.prototype.bar = bar; // Both cause this to be true: console.log(foo.__proto__.bar == bar); // true</code>
どちらのアプローチでも結果は得られます。 foo.__proto__.bar が bar に設定されている場合、パフォーマンスへの影響は大きく異なります。 Foo.prototype.bar の再割り当ては許容されますが、foo.__proto__.bar を直接変更することは強くお勧めできません。
このパフォーマンスの低下を理解する鍵は、JavaScript エンジンによって採用される内部最適化にあります。オブジェクトのプロパティにアクセスすると、エンジンは型と構造の推論に基づいて最適化を採用します。ただし、[[Prototype]] の変更はこれらの最適化を無効にし、エンジンが最適化されていない低速のコード パスにフォールバックすることを強制します。
このパフォーマンスの低下は、オブジェクトのプロトタイプを変更すると、本質的にその内部型が交換されるため発生します。プリコンパイルされたコードを中断し、プロパティ検索の最適化をフラッシュします。その結果、最新の JavaScript 実装での後続の実行は不可避的に遅くなります。
さらに、このようなプロトタイプの変更は型混乱の危険にもつながり、スクリプトの動作に関する推論がより難しくなり、VM とJIT実装。結果として、既存のプロトタイプを変更する代わりに、Object.create() を介して異なるプロトタイプ チェーンを持つ新しいオブジェクトを作成することをお勧めします。
以上が__proto__ を変更すると JavaScript のパフォーマンスが低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。