ES6 (zainspirowany odpowiedzią sendy halim poniżej):
myFunction.name
Objaśnienie dotyczące MDN . Od 2015 roku działa w nodejs i wszystkich głównych przeglądarkach oprócz IE.
Uwaga: W przypadku funkcji związanych daje to „ bound <originalName>
”. Będziesz musiał usunąć „związany”, jeśli chcesz uzyskać oryginalną nazwę.
ES5 (zainspirowany odpowiedzią Vlada):
Jeśli masz odwołanie do funkcji, możesz:
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
}
- Nie przeprowadziłem testów jednostkowych na tym, ani nie zweryfikowałem różnic implementacyjnych, ale w zasadzie powinno działać, jeśli nie zostawić komentarza.
- Uwaga: nie działa na powiązanych funkcjach
- Uwaga: to
caller
i callee
są uważane za przestarzałe.
[1] Zamieszczam to tutaj, ponieważ jest to legalne i często wystarczające narzędzia do podświetlania składni nie uwzględniają białych znaków między nazwą funkcji a nawiasami. Z drugiej strony nie znam żadnej implementacji .toString (), która zawierałaby tutaj białe znaki, dlatego możesz to pominąć.
W odpowiedzi na pierwotne pytanie porzuciłbym pasożytnicze dziedzictwo i wybrałem bardziej tradycyjne wzorce projektowania OOP. Napisałem TidBits.OoJs, aby wygodnie pisać kod OOP w JavaScript z zestawem funkcji naśladujących C ++ (jeszcze nie ukończony, ale głównie).
Z komentarzy wynika, że chciałbyś uniknąć przekazywania informacji parent
konstruktorowi. Muszę przyznać, że tradycyjne wzorce projektowe nie uchronią cię przed tym, ponieważ generalnie dobrze jest uwidocznić i narzucić swoje zależności.
Sugerowałbym również odejście od anonimowych funkcji. Sprawiają, że debugowanie i profilowanie jest PITA, ponieważ wszystko pojawia się jako „anonimowa funkcja” i nie mam dla nich żadnych korzyści, o których jestem świadomy.