Étant curieux mais toujours incapable de trouver la réponse au sujet de performance de la question ci-dessus, j'ai écrit cet essentiel pour nodejs afin de tester à la fois les performances et la fiabilité de toutes les solutions présentées (et notées).
J'ai comparé les temps de mur de la création d'une fonction de clone et de l'exécution d'un clone. Les résultats ainsi que les erreurs d'assertion sont inclus dans le commentaire de l'essentiel.
Plus mes deux cents (basé sur la suggestion de l'auteur):
clone0 cent (plus rapide mais plus laid):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (plus lent mais pour ceux qui n'aiment pas eval () à des fins connues seulement d'eux et de leurs ancêtres):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
En ce qui concerne les performances, si eval / new Function est plus lent que la solution wrapper (et cela dépend vraiment de la taille du corps de la fonction), cela vous donne un clone de fonction nue (et je veux dire le vrai clone superficiel avec des propriétés mais un état non partagé) sans fuzz inutile avec des propriétés cachées, des fonctions de wrapper et des problèmes avec la pile.
De plus, il y a toujours un facteur important à prendre en compte: moins il y a de code, moins il y a d'erreurs.
L'inconvénient de l'utilisation de la fonction eval / new est que le clone et la fonction d'origine fonctionneront dans des portées différentes. Cela ne fonctionnera pas bien avec les fonctions qui utilisent des variables de portée. Les solutions utilisant un wrapping de type bind sont indépendantes de la portée.