ES6 (inspiriert von der Antwort von sendy halim unten):
myFunction.name
Erläuterung zu MDN . Ab 2015 funktioniert in NodeJS und allen gängigen Browsern außer IE.
Hinweis: Bei gebundenen Funktionen ergibt dies " bound <originalName>
". Sie müssen die "Bindung" entfernen, wenn Sie den ursprünglichen Namen erhalten möchten.
ES5 (inspiriert von Vlads Antwort):
Wenn Sie einen Verweis auf die Funktion haben, können Sie Folgendes tun:
function functionName( func )
{
// Match:
// - ^ the beginning of the string
// - function the word 'function'
// - \s+ at least some white space
// - ([\w\$]+) capture one or more valid JavaScript identifier characters
// - \s* optionally followed by white space (in theory there won't be any here,
// so if performance is an issue this can be omitted[1]
// - \( followed by an opening brace
//
var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )
return result ? result[ 1 ] : '' // for an anonymous function there won't be a match
}
- Ich habe hierzu keine Komponententests durchgeführt oder Implementierungsunterschiede überprüft, aber im Prinzip sollte es funktionieren, wenn ich keinen Kommentar hinterlasse.
- Hinweis: Funktioniert nicht mit gebundenen Funktionen
- Hinweis: dass
caller
und callee
gelten als veraltet.
[1] Ich füge es hier ein, weil es legal ist und häufig genug Syntaxhervorhebungswerkzeuge den Leerraum zwischen Funktionsname und Klammer nicht berücksichtigen. Andererseits ist mir keine Implementierung von .toString () bekannt, die hier Leerzeichen enthält. Deshalb können Sie sie weglassen.
Als Antwort auf die ursprüngliche Frage würde ich die parasitäre Vererbung fallen lassen und mich für einige traditionellere OOP-Entwurfsmuster entscheiden. Ich habe ein TidBits.OoJs geschrieben, um bequem OOP-Code in JavaScript mit einem Funktionssatz zu schreiben, der C ++ nachahmt (noch nicht vollständig, aber meistens).
Ich sehe aus den Kommentaren, dass Sie vermeiden möchten, dass Informationsbedürfnisse parent
an den Konstruktor weitergegeben werden. Ich muss zugeben, dass traditionelle Entwurfsmuster Sie jedoch nicht davor bewahren werden, da es im Allgemeinen als eine gute Sache angesehen wird, Ihre Abhängigkeiten offensichtlich zu machen und durchzusetzen.
Ich würde auch vorschlagen, sich von anonymen Funktionen fernzuhalten. Sie machen das Debuggen und Profilieren einer PITA nur, weil alles nur als "anonyme Funktion" angezeigt wird und es keinen Nutzen für sie gibt, den ich kenne.