ES6 (ispirato dalla risposta di Halim Sendy di seguito):
myFunction.name
Spiegazione su MDN . A partire dal 2015 funziona in nodejs e tutti i principali browser tranne IE.
Nota: sulle funzioni associate questo darà " bound <originalName>
". Dovrai eliminare il "limite" se vuoi ottenere il nome originale.
ES5 (ispirato alla risposta di Vlad):
Se hai un riferimento alla funzione, puoi fare:
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
}
- Non ho eseguito test unitari su questo, o verificato differenze di implementazione, ma in linea di principio dovrebbe funzionare, se non lasciare un commento.
- Nota: non funziona con le funzioni associate
- Nota: quello
caller
e callee
sono considerati deprecati.
[1] Lo includo qui perché è legale e spesso abbastanza strumenti di evidenziazione della sintassi non tengono conto dello spazio bianco tra il nome della funzione e la parentesi. D'altra parte, non sono a conoscenza di alcuna implementazione di .toString () che includerà spazi bianchi qui, quindi è per questo che puoi ometterlo.
Come risposta alla domanda originale, lascerei cadere l'eredità parassitaria e scegliere alcuni modelli di design OOP più tradizionali. Ho scritto un TidBits.OoJs per scrivere comodamente il codice OOP in JavaScript con un set di funzionalità che imita il C ++ (non ancora completo, ma soprattutto).
Vedo dai commenti che vorresti evitare di passare le informazioni parent
necessarie al suo costruttore. Devo ammettere che i modelli di design tradizionali non ti salveranno da quello, dal momento che è generalmente una buona cosa rendere ovvie e applicate le tue dipendenze.
Vorrei anche suggerire di evitare le funzioni anonime. Fanno solo il debug e la profilazione di un PITA perché tutto si presenta come una "funzione anonima", e non ho alcun vantaggio di cui io sia a conoscenza.