Maison  >  Article  >  interface Web  >  Pourquoi la modification du [[Prototype]] d'un objet a-t-elle un impact sur les performances ?

Pourquoi la modification du [[Prototype]] d'un objet a-t-elle un impact sur les performances ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 00:22:02486parcourir

Why Does Modifying an Object's [[Prototype]] Impact Performance?

Impact de la modification du [[Prototype]] d'un objet sur les performances

La documentation Mozilla pour la méthode standard setPrototypeOf et le __proto__ non standard La propriété met en garde contre la mutation du [[Prototype]] d'un objet, soulignant son impact néfaste sur les performances dans les implémentations JavaScript modernes.

Cependant, cet avertissement ne s'applique pas à l'ajout de fonctions membres à des classes utilisant Function.prototype comme celui-ci. :

function Foo(){}
function bar(){}

var foo = new Foo();
Foo.prototype.bar = bar;
console.log(foo.__proto__.bar == bar); // true

Dans cet exemple, foo.__proto__.bar = bar et Foo.prototype.bar = bar obtiennent le même résultat sans implications en termes de performances.

Le problème survient lors de la réaffectation à la propriété __proto__ elle-même :

function Employee() {}
var fred = new Employee();

fred.__proto__ = Object.prototype;
// Or equally:
Object.setPrototypeOf(fred, Object.prototype);

L'avertissement dans la documentation indique explicitement que la modification de la chaîne de prototypes d'un objet existant perturbe les optimisations effectuées par les moteurs JavaScript modernes. Il suggère de créer de nouveaux objets avec la chaîne de prototypes souhaitée à l'aide de Object.create().

Cette dégradation des performances provient des détails d'implémentation internes des classes cachées dans les moteurs JavaScript comme V8. Lorsque la chaîne de prototypes d'un objet est modifiée, son type interne change, invalidant les optimisations de recherche de propriétés et le code compilé.

Les experts de la communauté JavaScript ont souligné les complexités et les risques de bogues associés à l'autorisation de la mutation du prototype après la création, citant ses effets néfastes sur l'inférence de type, les proxys et la stabilité des performances.

Par conséquent, même si la modification des fonctions membres à l'aide de Function.prototype ne pose pas de problèmes de performances, la réaffectation de la propriété __proto__ d'un objet doit être évitée pour éviter des pénalités d'optimisation.

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