Siendo curioso pero aún incapaz de encontrar la respuesta al tema de rendimiento de la pregunta anterior, escribí esta esencia para nodejs para probar tanto el rendimiento como la confiabilidad de todas las soluciones presentadas (y calificadas).
He comparado los tiempos de muro de la creación de una función de clonación y la ejecución de un clon. Los resultados junto con los errores de afirmación se incluyen en el comentario de la esencia.
Más mis dos centavos (según la sugerencia del autor):
clone0 cent (más rápido pero más feo):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (más lento pero para aquellos a quienes no les gusta eval () para propósitos que solo ellos y sus ancestros conocen):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
En cuanto al rendimiento, si eval / new Function es más lento que la solución de envoltura (y realmente depende del tamaño del cuerpo de la función), le brinda un clon de función desnudo (y me refiero al clon superficial real con propiedades pero estado no compartido) sin problemas innecesarios con propiedades ocultas, funciones de envoltura y problemas con la pila.
Además, siempre hay un factor importante que debe tener en cuenta: cuanto menos código, menos lugares para errores.
La desventaja de usar la función eval / new es que el clon y la función original operarán en diferentes ámbitos. No funcionará bien con funciones que utilizan variables de ámbito. Las soluciones que utilizan envoltura similar a un enlace son independientes del alcance.