ES6(灵感来自以下Sendy Halim的答案):
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来舒适地用JavaScript编写OOP代码,其功能集模仿C++(尚未完成,但大多数)。
我从评论中看到,您希望避免将信息需求传递给它的构造函数。我必须承认,传统的设计模式并不能使你免于这种模式,因为通常认为让你的依赖关系变得明显并强制执行是一件好事。parent
我还建议远离匿名函数。它们只使调试和分析PITA,因为所有内容都显示为“匿名函数”,并且据我所知,它们没有任何好处。