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 (), яка б тут містила пробіл, тому ви можете опустити його.
Як відповідь на оригінальне запитання, я б відмовився від спадок паразитів і пішов би на деякі більш традиційні моделі дизайну OOP. Я написав TidBits.OoJs, щоб зручно писати код OOP в JavaScript з набором функцій, що імітують C ++ (ще не завершено, але в основному).
З коментарів я бачу, що ви хочете уникнути передачі інформаційних parent
потреб його конструктору. Я мушу визнати, що традиційні моделі дизайну не врятують вас від цього, оскільки, як правило, вважається хорошою справою зробити ваші залежності очевидними та нав'язаними.
Я б також запропонував відмовитися від анонімних функцій. Вони роблять налагодження і профілюють PITA, тому що все відображається як "анонімна функція", і немає користі для них, про які я знаю.