Grałem około z tym przez ostatnie 3 godziny i wreszcie to przynajmniej nieco elegancki użyciu nowej funkcji, jak sugerowano na inne wątki:
/**
* JavaScript Rename Function
* @author Nate Ferrero
* @license Public Domain
* @date Apr 5th, 2014
*/
var renameFunction = function (name, fn) {
return (new Function("return function (call) { return function " + name +
"() { return call(this, arguments) }; };")())(Function.apply.bind(fn));
};
/**
* Test Code
*/
var cls = renameFunction('Book', function (title) {
this.title = title;
});
new cls('One Flew to Kill a Mockingbird');
Po uruchomieniu powyższego kodu na konsoli powinny pojawić się następujące dane wyjściowe:
Book {title: "One Flew to Kill a Mockingbird"}
Czy możesz wyjaśnić, jaki problem próbujesz rozwiązać? – Philipp
@Philipp: Na przykład OP może być zainteresowany zastąpieniem jakiegoś konstruktora innym, ale nadaniem mu tej samej nazwy co oryginalny konstruktor, więc kod widzi tę samą nazwę funkcji. To może być jeden z powodów, z którymi mam do czynienia. Ale jestem pewien, że są inni. –