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!