ホームページ  >  記事  >  ウェブフロントエンド  >  オブジェクトの [[プロトタイプ]] の変更が JavaScript のパフォーマンスを低下させるのはなぜですか?

オブジェクトの [[プロトタイプ]] の変更が JavaScript のパフォーマンスを低下させるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 20:09:03527ブラウズ

Why is Modifying an Object's [[Prototype]] a Performance Killer in JavaScript?

オブジェクトの [[プロトタイプ]] を変更するとパフォーマンスが低下するのはなぜですか?

Mozilla Developer Network (MDN) は、オブジェクトの [[プロトタイプ]] を変更しないことを強く推奨しています。使用されるメソッドに関係なく、オブジェクトの [[Prototype]]。この警告は、最新の JavaScript 実装で発生する重大なパフォーマンス ペナルティに起因します。

Function.prototype を使用して JavaScript クラスにメンバー関数を追加することが推奨されますが、次の操作は両方とも次のとおりです。

foo.__proto__.bar = bar;
Foo.prototype.bar = bar;

機能的に同等であり、Object.getPrototypeOf(foo)` オブジェクトに 'bar プロパティを作成します。

問題は、'bar` プロパティの作成ではなく、'__proto__ プロパティ自体への割り当てにあります。

fred.__proto__ = Object.prototype;

この操作により、プロパティ アクセスに関する JavaScript エンジンの最適化が中断されます。既存のオブジェクトのプロトタイプ チェーンを変更すると、それまでの最適化の取り組みが実質的に無効になります。

たとえば、V8 JavaScript エンジンは、プロパティの検索を最適化するために隠しクラスを利用します。プロトタイプ チェーンを変更すると、これらの最適化が無効になり、エンジンは非効率な方法にフォールバックすることになります。

この分野の専門家は、変更可能なプロトタイプのパフォーマンスへの影響について懸念を表明しています。

  • Brendanアイヒ: 「書き込み可能な プロト は、実装するのが大変です...そして、あらゆる種類の型混乱の危険が生じます。」
  • Brian Hackett: 「スクリプトを許可する」プロトタイプを変更すると...スクリプトの動作を推論することが難しくなり、VM、JIT、分析の実装がより複雑でバグが増えます。"
  • Jeff Walden: "作成後のプロトタイプの変更、不安定なパフォーマンスの不安定化、プロキシと [[SetInheritance]] への影響

コンセンサスは明らかです。オブジェクトの [[Prototype]] を変更することはパフォーマンスの最適化に悪影響を与えるため、避けるべきです。代わりに、Object.create() を使用して一意のプロトタイプ チェーンを持つ新しいオブジェクトを作成することをお勧めします。

以上がオブジェクトの [[プロトタイプ]] の変更が JavaScript のパフォーマンスを低下させるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。