DevTools如何确定对象构造函数的名称?

12

我正在使用 Chrome v22.0.1229.94 m,虽然这可能并不重要,但以防万一:-)

可移植性对我来说无关紧要。 只要能在 Chrome(和 Safari)中正常工作,我就很满意。

我有两个函数,foo和bar:

var foo = function() {
  ...
}
function bar() {
  ...
}

然后如果我使用它们创建对象:

f1 = new foo();
b1 = new bar();

我可以获取bar的构造函数名称,但不能获取foo的:

> f1.constructor.name  ==> ""
> b1.constructor.name  ==> "bar"

然而在这两种情况下,开发者工具控制台都会显示变量f1b1的名称为"foo"和"bar"。

我该如何像开发者工具一样提取出f1的名称foo

enter image description here


这很有趣。就像开发工具任意命名匿名函数一样。也看看这个:var foo = function myfoo(){}; new foo(); ==> myfoo - Mohsen
@Mohsen,感谢您提供的屏幕截图和支持性评论。 - CyberFonic
这是一个很棒的问题,我简直不敢相信我自己不能从函数中获取这个名称... 我需要它 :D 有找到解决方案的运气吗? - Wilt
2个回答

8

V8可以在解析阶段执行函数名称推断,通过其API公开此信息。您无法使用常规对象属性提取此信息。


1
我不反对使用V8 API(不需要可移植性)。您能指引我查阅该API文档的方向吗? - CyberFonic

2
在这个例子中,对于foo,你创建了一个函数表达式。这意味着,你正在将一个匿名函数分配给一个变量。
你不能像那样以编程方式解析函数name,除非你给函数命名并创建一个“命名函数表达式”。
var foo = function foo() {
  ...
}

1
他的问题是开发者工具如何在执行new foo()后返回一个名为foo的对象? - Mohsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接