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
}
- 我没有对此进行单元测试,也没有验证过实现差异,但原则上它应该可以工作,如果没有发表评论。
- 注意:不适用于绑定函数
- 注意: that
caller
和callee
被视为已弃用。
[1] 我把它包含在这里是因为它是合法的,而且语法高亮工具通常没有考虑到函数名和括号之间的空格。另一方面,我不知道 .toString() 的任何实现会在此处包含空格,因此您可以省略它。
作为对原始问题的回答,我将放弃寄生继承并采用一些更传统的 OOP 设计模式。我写了一个TidBits.OoJs来舒适地用 JavaScript 编写 OOP 代码,其中包含模仿 C++ 的功能集(尚未完成,但主要是)。
我从评论中看到您希望避免将信息parent
需求传递给它的构造函数。我必须承认,虽然传统设计模式不会让您免于这种情况,因为通常认为使您的依赖项显而易见并强制执行是一件好事。
我还建议远离匿名函数。他们只对 PITA 进行调试和分析,因为一切都只是显示为“匿名函数”,据我所知,他们没有任何好处。