Maison  >  Article  >  interface Web  >  Pourquoi la modification du [[Prototype]] d'un objet tue-t-elle les performances en JavaScript ?

Pourquoi la modification du [[Prototype]] d'un objet tue-t-elle les performances en JavaScript ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 20:09:03473parcourir

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

Pourquoi la modification du [[Prototype]] de l'objet tue-t-elle les performances ?

Le Mozilla Developer Network (MDN) déconseille fortement de modifier un le [[Prototype]] de l'objet, quelle que soit la méthode utilisée. Cet avertissement découle des pénalités de performances importantes qu'il encourt sur les implémentations JavaScript modernes.

Bien que l'ajout de fonctions membres aux classes JavaScript via Function.prototype soit recommandé, les deux opérations suivantes :

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

sont fonctionnellement équivalent et créez une propriété 'bar` sur l'objet Object.getPrototypeOf(foo)`.

Le problème ne réside pas dans la création de la propriété 'bar`, mais dans l'attribution à la propriété '__proto__ elle-même :

fred.__proto__ = Object.prototype;

Cette opération rompt les optimisations du moteur JavaScript pour l'accès aux propriétés. En modifiant la chaîne de prototypes d'un objet existant, vous détruisez efficacement tous les efforts d'optimisation antérieurs.

Le moteur JavaScript V8, par exemple, utilise des classes cachées pour optimiser les recherches de propriétés. La modification de la chaîne de prototypes invalide ces optimisations, obligeant le moteur à recourir à des méthodes moins efficaces.

Les experts dans le domaine ont exprimé leurs inquiétudes quant aux implications en termes de performances des prototypes mutables :

  • Brendan Eich : "Le proto inscriptible est très pénible à mettre en œuvre... et il crée toutes sortes de risques de confusion de types."
  • Brian Hackett : "Autoriser les scripts muter le prototype... rend plus difficile le raisonnement sur le comportement d'un script et rend la mise en œuvre de la VM, du JIT et de l'analyse plus complexe et plus boguée."
  • Jeff Walden : "Mutation du prototype après la création, avec son déstabilisation erratique des performances et impact sur les proxys et [[SetInheritance]]"

Le consensus est clair : la mutation du [[Prototype]] d'un objet perturbe les optimisations des performances et doit être évitée. Au lieu de cela, créer de nouveaux objets avec des chaînes de prototypes uniques à l'aide de Object.create() est l'approche préférée.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn