ES6 (вдохновленный ответом Сэнди Халима ниже):
myFunction.name
Пояснение по МДН . С 2015 года работает в nodejs и во всех основных браузерах, кроме IE.
Примечание: для связанных функций это даст " bound <originalName>
". Вам придется лишить «связанного», если вы хотите получить оригинальное имя.
ES5 (вдохновленный ответом Влада):
Если у вас есть ссылка на функцию, вы можете сделать:
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
}
- Я не запускал модульные тесты по этому вопросу или проверял различия в реализации, но в принципе это должно работать, если не оставить комментарий.
- Примечание: не будет работать на связанных функциях
- Примечание: это
caller
и callee
считается устаревшим.
[1] Я включил его сюда, потому что он является законным и достаточно часто инструменты подсветки синтаксиса не учитывают пробел между именем функции и круглыми скобками. С другой стороны, я не знаю ни о какой реализации .toString (), которая будет включать здесь пробелы, поэтому вы можете ее опустить.
В качестве ответа на первоначальный вопрос я бы отказался от паразитического наследования и остановился на некоторых более традиционных шаблонах проектирования ООП. Я написал TidBits.OoJs для удобного написания кода ООП на JavaScript с набором функций, имитирующим C ++ (еще не завершенным, но в основном).
Из комментариев я вижу, что вы хотели бы избежать передачи информационных parent
потребностей его конструктору. Я должен признать, что традиционные шаблоны проектирования не спасут вас от этого, хотя, как правило, считается хорошей идеей сделать ваши зависимости очевидными и обязательными.
Я также предложил бы держаться подальше от анонимных функций. Они делают только отладку и профилирование PITA, потому что все просто проявляется как «анонимная функция», и я не вижу в них никакой пользы.