ES6 (inspirado na resposta de sendy halim abaixo):
myFunction.name
Explanação no MDN . A partir de 2015, trabalha no nodejs e nos principais navegadores, exceto no IE.
Nota: Nas funções ligadas, isso dará " bound <originalName>
". Você precisará remover o "limite" se desejar obter o nome original.
ES5 (inspirado na resposta de Vlad):
Se você tiver uma referência à função, poderá:
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
}
- Não executei testes de unidade nisso ou verifiquei diferenças de implementação, mas, em princípio, deve funcionar, se não deixar um comentário.
- Nota: não funcionará em funções vinculadas
- Nota: isso
caller
e callee
é considerado obsoleto.
[1] Eu o incluo aqui porque é legal e muitas vezes as ferramentas de destaque de sintaxe falham em levar em consideração o espaço em branco entre o nome da função e os parênteses. Por outro lado, não conheço nenhuma implementação de .toString () que inclua espaço em branco aqui; é por isso que você pode omiti-lo.
Como resposta à pergunta original, eu descartaria a herança parasitária e buscaria alguns padrões de design de POO mais tradicionais. Eu escrevi um TidBits.OoJs para escrever confortavelmente código OOP em JavaScript com um conjunto de recursos que imitava C ++ (ainda não completo, mas principalmente).
Vejo pelos comentários que você gostaria de evitar a transmissão de informações parent
necessárias para seu construtor. Devo admitir que os padrões tradicionais de design não o salvam, pois geralmente é uma coisa boa tornar suas dependências óbvias e impostas.
Eu também sugeriria me afastar de funções anônimas. Eles apenas fazem da depuração e criação de perfil uma PITA porque tudo aparece como "função anônima", e não há nenhum benefício para eles que eu saiba.