ES6 (на основе ответа Сэнди Халима ниже):
myFunction.name
Объяснение по MDN .По состоянию на 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, потому что все просто отображается как «анонимная функция», и я не вижу в них никакой пользы.