ES6 (inspiré par la réponse de sendy halim ci-dessous):
myFunction.name
Explication sur MDN . À partir de 2015, fonctionne dans nodejs et tous les principaux navigateurs, sauf IE.
Remarque: Sur les fonctions liées, cela donnera " bound <originalName>
". Vous devrez supprimer la "borne" si vous souhaitez obtenir le nom d'origine.
ES5 (inspiré par la réponse de Vlad):
Si vous avez une référence à la fonction, vous pouvez faire:
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
}
- Je n'ai pas exécuté de tests unitaires à ce sujet, ni vérifié les différences d'implémentation, mais en principe, cela devrait fonctionner, sinon laisser un commentaire.
- Remarque: ne fonctionnera pas sur les fonctions liées
- Remarque: cela
caller
et callee
sont considérés comme obsolètes.
[1] Je l'inclus ici car il est légal et souvent les outils de mise en évidence de la syntaxe ne prennent pas en compte l'espace blanc entre le nom de la fonction et la parenthèse. D'un autre côté, je ne connais aucune implémentation de .toString () qui inclura des espaces blancs ici, c'est pourquoi vous pouvez l'omettre.
En réponse à la question d'origine, je supprimerais l'héritage parasite et opterais pour des modèles de conception OOP plus traditionnels. J'ai écrit un TidBits.OoJs pour écrire confortablement du code OOP en JavaScript avec un ensemble de fonctionnalités imitant le C ++ (pas encore terminé, mais surtout).
Je vois dans les commentaires que vous souhaitez éviter de transmettre les parent
besoins d' informations à son constructeur. Je dois admettre que les modèles de conception traditionnels ne vous sauveront pas de celui-ci, car il est généralement considéré comme une bonne chose de rendre vos dépendances évidentes et appliquées.
Je suggère également de s'éloigner des fonctions anonymes. Ils ne font que le débogage et le profilage d'un PITA parce que tout apparaît simplement comme une "fonction anonyme", et il n'y a aucun avantage pour eux que je sache.