オブジェクトの [[Prototype]] の変更がパフォーマンスに与える影響
標準の setPrototypeOf メソッドと非標準の __proto__ に関する Mozilla ドキュメントプロパティは、オブジェクトの [[Prototype]] の変更に対して警告し、最新の JavaScript 実装におけるパフォーマンスへの悪影響を強調します。
ただし、この警告は、このように Function.prototype を使用してクラスにメンバー関数を追加する場合には適用されません。 :
function Foo(){} function bar(){} var foo = new Foo(); Foo.prototype.bar = bar; console.log(foo.__proto__.bar == bar); // true
この例では、 foo.__proto__.bar = bar と Foo.prototype.bar = bar の両方が、パフォーマンスに影響を与えることなく同じ結果を達成します。
問題は、再割り当てが発生したときに発生します。 __proto__ プロパティ自体:
function Employee() {} var fred = new Employee(); fred.__proto__ = Object.prototype; // Or equally: Object.setPrototypeOf(fred, Object.prototype);
ドキュメントの警告では、既存のオブジェクトのプロトタイプ チェーンを変更すると、最新の JavaScript エンジンによって実行される最適化が中断されることが明示的に述べられています。 Object.create() を使用して、目的のプロトタイプ チェーンを持つ新しいオブジェクトを作成することを提案します。
このパフォーマンスの低下は、V8 などの JavaScript エンジンの非表示クラスの内部実装の詳細に起因します。オブジェクトのプロトタイプ チェーンが変更されると、その内部型が変更され、プロパティ ルックアップの最適化とコンパイルされたコードが無効になります。
JavaScript コミュニティの専門家は、作成後のプロトタイプの変更を許可することに伴う複雑さとバグのリスクを強調しており、次のように述べています。型推論、プロキシ、パフォーマンスの安定性に悪影響を及ぼします。
したがって、Function.prototype を使用してメンバー関数を変更してもパフォーマンスの問題は生じませんが、最適化のペナルティを防ぐために、オブジェクトの __proto__ プロパティの再割り当ては避けるべきです。
以上がオブジェクトの [[プロトタイプ]] を変更するとパフォーマンスに影響するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。