【问题标题】:How does DevTools determine an object's constructor's name?DevTools 如何确定对象的构造函数名称?
【发布时间】:2012-10-08 07:47:55
【问题描述】:

我使用的是 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 时,DevTools 控制台都会显示名称“foo”和“bar”。

如何像 DevTools 一样提取 f1name foo

【问题讨论】:

  • 这很有趣。这就像 devtools 将匿名函数命名为任意。也请观看:var foo = function myfoo(){}; new foo(); ==> myfoo
  • @Mohsen 感谢截屏和您的支持评论。
  • 这是一个很棒的问题,我不敢相信我自己不可能从函数中获得这个名字......我需要它:D 有没有运气找到解决方案??

标签: javascript constructor google-chrome-devtools


【解决方案1】:

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

【讨论】:

  • 我并不反对使用 V8 API(不需要可移植性)。你能指点我该 API 文档的方向吗?
【解决方案2】:

对于foo,您正在创建一个函数表达式。这意味着,您将一个 匿名函数 分配给一个变量。

你不能像这样以编程方式解析函数name,除非你给函数一个名字并创建一个“命名函数表达式”。

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

【讨论】:

  • 他的问题是开发者工具如何显示一个名为foo 的对象以返回new foo()
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多