Pourquoi la mutation de la [[prototype]] d'un objet mauvais pour la performance?

Du MDN docs pour la standard setPrototypeOf function ainsi que la non-standard __proto__ de la propriété:

La mutation de la [[Prototype]] d'un objet, peu importe comment cela est accompli, il est fortement déconseillé, car il est très lent et inévitablement ralentit l'exécution subséquente moderne implémentations de JavaScript.

À l'aide de Function.prototype pour ajouter des propriétés est la façon d'ajouter des fonctions de membre de classes javascript. Alors, comme le montre l'exemple suivant:

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

Pourquoi est foo.__proto__.bar = bar; mauvais? Si son mal n'est pas Foo.prototype.bar = bar; tout aussi mauvais?

Alors pourquoi cette mise en garde: il est très lent et inévitablement ralentit l'exécution subséquente moderne implémentations JavaScript. Sûrement Foo.prototype.bar = bar; n'est pas si mauvais que ça.

Mise à jour peut-être par la mutation qu'ils voulaient dire d'une réaffectation. Voir accepté de répondre.

  • __proto__ est obsolète non-standard de la propriété. ainsi que sur la manière, il serait agréable de voir les réponses que l'adresse de performances de la question directement: Pourquoi est-il "..très lente et, inévitablement, ralentit l'exécution subséquente moderne implémentations JavaScript"?
  • merci. C'était mon intention. Mise à jour de question pour être plus explicit en mentionnant la nouvelle façon standard.
  • Je ne peux pas trouver la réponse, je veux faire référence, mais autant que je me souvienne de modifier le prototype nécessiterait la js moteur de jeter tous les code natif créé par le JIT-compilateur pour ces objets, comme les propriétés ne correspondent plus, ce qui ralentit tout.
  • d'accord. C'est pourquoi je me demande pourquoi foo.__proto__.bar = bar; est mauvais.
  • J'imagine qu'ils ont tous deux le même problème. Il semble que la JS moteur aurait besoin de "vider" toute mise en cache de la propriété des résolutions ou d'autres compilé/intermédiaire IL pour tous enchaînés (dérivée) des objets.
  • Je suppose qu'il doit dire la mutation après avoir instances créées est mauvais. Deux de ces méthodes pourraient être tout aussi mauvais et Alex réponse s'appliquent.
  • Peut-être. Mais je ne suis pas d'accord avec cette réponse, car il me semble jupe toutes les questions relatives à l'explicite mutation (on peut muter sans __proto__, comme indiqué) et implique qu'il n'y a pas de telles optimisations en cours (qui auraient un impact sur les performances wrt. les mutations non-nulle).
  • J'ai trouvé la question et la réponse correspondante que je recherche: dois-je mettre les valeurs par défaut des attributs sur le prototype pour économiser de l'espace? bien que pas entièrement lié je pense que c'est une des raisons pour lesquelles vous ne devriez pas le faire.

InformationsquelleAutor basarat | 2014-05-22