JavaScript: Klonen Sie eine Funktion
Was ist der Schnellste Weg, um Klon-Funktion in JavaScript (mit oder ohne seine Eigenschaften)?
Zwei Optionen in den Sinn kommen sind eval(func.toString())
und function() { return func.apply(..) }
. Aber ich bin besorgt über die Leistung von eval und Verpackung-machen-Stapel schlimmer und wird wahrscheinlich die Leistung beeinträchtigen, wenn eine Menge oder angewendet, um bereits verpackt.
new Function(args, body)
sieht nett aus, aber wie genau kann ich zuverlässig split vorhandene Funktion args und Körper, ohne ein JS-parser in JS?
Vielen Dank im Voraus.
Update:
Was ich meine ist, in der Lage zu tun
var funcB = funcA.clone(); //where clone() is my extension
funcB.newField = {...}; //without affecting funcA
InformationsquelleAutor der Frage Andrey Shchekin | 2009-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen Sie dies:
InformationsquelleAutor der Antwort Jared
Hier ist eine aktualisierte Antwort
Jedoch ".bind" ist eine moderne ( >=iE9 ) - Funktion von JavaScript (mit ein Kompatibilitäts-workaround von MDN)
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
Hinweis:dass es nicht Klonen die Funktion Objekt zusätzliche angebracht Eigenschafteneinschließlich die Prototyp Eigenschaft. Kredit @jchook
Hinweis:dass die neue Funktion diese variable ist fest mit dem argument auf binden(), auch auf die neue Funktion apply () - Aufrufe. Kredit @Kevin
Hinweis: gebundenen Funktion Objekt instanceof behandelt newFunc/oldFunc, wie die gleichen. Kredit @Christoph
InformationsquelleAutor der Antwort PicoCreator
Hier ist eine etwas bessere version von Jared ' s Antwort. Dieser wird nicht am Ende mit tief verschachtelten Funktionen mehr, die Sie Klonen. Es ruft immer das original.
Außerdem, in Reaktion auf die aktualisierte Antwort von pico.Schöpfer, es ist erwähnenswert, dass die
bind()
Funktion Hinzugefügt, die in Javascript 1.8.5 hat das gleiche problem wie Jared ' s Antwort - es wird die Verschachtelung verursacht langsamer und die Funktionen jedes mal, wenn es verwendet wird.InformationsquelleAutor der Antwort Justin Warkentin
Neugierig, aber noch nicht in der Lage, die Antwort zu finden, um die Leistung Thema der Frage oben, ich schrieb das gist für nodejs testen die Leistung und die Zuverlässigkeit der präsentierten (und erzielte) Lösungen.
Habe ich gegenüber der Wand zu Zeiten der Klon-Funktion-Erstellung und die Ausführung von einem Klon.
Die Ergebnisse zusammen mit assertion-Fehler enthalten sind, die in der gist ' s Kommentar.
Plus meine zwei Cent (basierend auf des Autors Vorschlag):
clone0 cent (schneller, aber hässlicher):
clone4 cent (langsamer, aber für diejenigen, die Abneigung eval() für Zwecke, die nur Sie selbst und Ihre Vorfahren):
Als für die Leistung, wenn eval/neue Funktion ist langsamer als wrapper-Lösung (und es hängt wirklich davon ab, die Funktion Körper-Größe), es gibt Sie bare Funktion clone (und ich meine die wahre seichten Klon mit Eigenschaften, aber nicht freigegebenen Zustand), ohne unnötige schnörksel mit versteckten Eigenschaften, die wrapper-Funktionen und Probleme mit dem stack.
Plus gibt es immer ein wichtiger Faktor, den Sie berücksichtigen müssen: je weniger code, desto weniger Plätze für Fehler.
Der Nachteil bei der Verwendung der eval/neue Funktion ist, dass der Klon und das original-Funktion arbeiten in verschiedenen Bereichen. Es funktioniert nicht gut mit Funktionen, die über den Gültigkeitsbereich von Variablen. Die Lösungen mit binden-wie Verpackung sind Umfang unabhängig.
InformationsquelleAutor der Antwort royaltm
War es ziemlich aufregend, auf diese Weise zu arbeiten, so macht es einen Klon von einer Funktion über Aufruf der Funktion.
Einige Einschränkungen über Verschlüsse beschrieben MDN-Funktion Referenz
Genießen.
InformationsquelleAutor der Antwort Max Dolgov
Kurz und einfach:
InformationsquelleAutor der Antwort micahblu
Nur Wundern - warum würden Sie wollen, Klon-Funktion, wenn Sie Prototypen UND können den Umfang einer Funktion aufrufen, um alles, was Sie möchten?
InformationsquelleAutor der Antwort Upperstage
Wenn Sie möchten, erstellen Sie einen clone mit der Function-Konstruktor, so etwas wie dies funktionieren sollte:
Einen einfachen test:
Diese Klone verlieren Ihre Namen und Geltungsbereich für alle geschlossen über Variablen, obwohl.
InformationsquelleAutor der Antwort tobymackenzie
Habe ich verbessert wurde Jared ' s Antwort auf meine eigene Art und Weise:
1) jetzt ist es unterstützt das Klonen von Konstruktoren (können call mit new); in diesem Fall dauert nur 10 Argumente (Sie können variieren) - wegen der Unmöglichkeit der übergabe aller Argumente im ursprünglichen Konstruktor
2) alles ist in der richtigen Verschlüsse
InformationsquelleAutor der Antwort max.minin