Skip to content

Instantly share code, notes, and snippets.

@Tom32i
Created January 15, 2016 14:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tom32i/1bfce5b7f2a97dc18339 to your computer and use it in GitHub Desktop.
Save Tom32i/1bfce5b7f2a97dc18339 to your computer and use it in GitHub Desktop.
Faut-il nommer les "méthodes" des prototypes ?
function Car (color)
{
this.color = color;
}
// Fonction anonyme?
Car.prototype.getColor = function()
{
return this.color;
};
// VS
// Fonction nommée?
Car.prototype.getColor = function getColor()
{
return this.color;
};
@Tom32i
Copy link
Author

Tom32i commented Jan 15, 2016

Quel est l'impact ?

@tdd
Copy link

tdd commented Jan 15, 2016

Hello,

Côté perfs, aucun impact.

Côté débogage en revanche… ça dépend de ta runtime.

Avant ES6, il n'y avait aucune formalisation du "nommage automatique" des fonctions à partir de leur environnement lexical, et donc, techniquement, tes fonctions anonymes devraient apparaître au débogage (call stack notamment) sous le générique "(anonymous function)", ce qui sent grave des pieds.

Néanmoins, divers navigateurs appliquaient déjà un nommage lexical automatique, pas dans la propriété name (qui respectait la spec et restait undefined) mais dans displayName (qui n'est pas dans la spec, vient de v8 à la base, et n'est utilisée que par les debuggers). Ainsi dans ton 2e exemple, sur Chrome (et sans doute d'autres), tu verrais sans doute "Car.prototype.getColor" comme nom de fonction dans le debugger.

Néanmoins, il reste intéressant de toujours nommer explicitement les fonctions qui ne sont pas de simples callbacks intermédiaires (et donc avec très peu de valeur sémantique). D'abord, ça garantit que quelle que soit la runtime, tu auras un nom au débogage. Ensuite, ça permet de dissocier le nom "public" (celui de la propriété) du nom "interne" (la propriété name qui, faute de displayName la surchargeant, apparaîtra au débogage).

C'est très pratique quand tu as un framework où plusieurs "classes" ont des méthodes forcément homonymes, en spécialisant la même classe de base, mais que tu veux tout de suite savoir de laquelle tu parles. Par exemple, disons que tu as une douzaine de vues Backbone ou composants React, tous avec leur méthode render. Pas terrible de voir juste "render" à chaque fois. Mais rien ne t'empêche, en ES3-5, de dire :

var Button = React.createClass({
  render: function renderButton() {
    // …
  }
});

Ainsi, le nom interne de ta fonction, renderButton, apparaît au débogage et te dit immédiatement de quel composant on parle.

Note qu'en ES6, les litéraux objets/classe auto-calent le nom, avec la nouvelle syntaxe. Et les fonctions anonymes ne restent possibles (depuis toujours) que pour des expressions de fonction, et non des déclarations.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment