ES6(受下面的sendy halim的回答启发):
myFunction.name
关于MDN的说明。自2015年起,可在nodejs和除IE之外的所有主要浏览器中使用。
注意:在绑定函数上,将给出“ bound <originalName>
”。如果要获取原始名称,则必须删除“ bound”。
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,它以类似于 C ++的功能集舒适地用JavaScript编写OOP代码(尚未完成,但大多数情况下)。
从评论中可以看出,您希望避免将信息parent
需求传递给它的构造函数。我必须承认,传统的设计模式不会使您摆脱那种模式,因为通常使您的依赖关系清晰可见并强制执行是一件好事。
我还建议不要使用匿名函数。他们只进行调试和配置PITA,因为所有内容都显示为“匿名函数”,而我所知道的对他们没有任何好处。