Maison >interface Web >js tutoriel >Pourquoi la mutation de __proto__ entraîne-t-elle une dégradation des performances en JavaScript ?
Mutation de __proto__ : pourquoi les performances en souffrent
La documentation de la propriété proto en JavaScript déconseille fortement de modifier le [[ Prototype]] d'un objet en raison de son impact néfaste sur les performances. En effet, contrairement à l'ajout de propriétés à Function.prototype, la modification du prototype d'un objet a de profondes implications pour les implémentations JavaScript modernes.
Considérez l'exemple suivant :
<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>
Alors que les deux approches aboutissent si foo.__proto__.bar est défini sur bar, leur impact sur les performances est très différent. La réaffectation de Foo.prototype.bar est acceptable, mais la modification directe de foo.__proto__.bar est fortement déconseillée.
La clé pour comprendre cette pénalité de performances réside dans les optimisations internes utilisées par les moteurs JavaScript. Lorsque les propriétés sont accessibles sur un objet, le moteur utilise des optimisations basées sur des inférences de type et de structure. Cependant, toute mutation du [[Prototype]] invalide ces optimisations, obligeant le moteur à recourir à des chemins de code non optimisés plus lents.
Cette pénalité de performances survient car la modification du prototype d'un objet permute essentiellement son type interne, perturber le code précompilé et vider les optimisations de recherche de propriétés. Par conséquent, l'exécution ultérieure dans les implémentations JavaScript modernes devient inévitablement plus lente.
En outre, il est crucial de noter que de telles mutations de prototypes peuvent également entraîner des risques de confusion de types, rendant le raisonnement sur le comportement des scripts plus difficile et introduisant des complexités dans les VM et Implémentations JIT. Par conséquent, créer un nouvel objet avec une chaîne de prototypes différente via Object.create() est l'approche recommandée au lieu de muter les prototypes existants.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!