什么是Chrome调试器中显示的“类名”?可以控制吗?

时间:2013-12-18 21:04:46

标签: javascript google-chrome

Chrome的调试器中显示的“类名”是如何确定的?它们基于什么?

例如,对于function Foo() {},“类名”非常明显:

> function Foo() {}
> new Foo()
Foo {} // shows the "class name" Foo

这似乎由.name属性控制,但事实并非如此:

> Foo.name = "NotFoo"
> new Foo()
Foo {} // shows "Foo", not "NotFoo"

但有时可能会非常令人惊讶:

> function subclass(base, methods) {
  var initializer = methods.__init__;
  initializer.prototype = $.extend(initializer.prototype, base.prototype, methods);
  return initializer;
}
> Bar = subclass(Object, { __init__: function() {} });
> new Bar()
subclass.__init__ {__init__: function} // Shows "subclass.__init__"… ?!

这个“班级名称”是如何确定的?

而且,是否可以控制或修改?

这似乎是针对Chrome的,因为Firefox似乎没有尝试在第二个示例中猜测“类名”。

3 个答案:

答案 0 :(得分:2)

Google Chrome官方网站对此没有帮助,但我指出了这一点:

How are javascript class names calculated for custom classes in Chrome Dev Tools?

我不认为你可以覆盖chrome console" s"演绎"机构。

一些控制台游戏:

>>function Foo(){}
>>function NotFoo(){}
>>var a = new Foo();
>>a.constructor = NotFoo;
>>a
Foo {constructor: function}
constructor: function NotFoo(){}
__proto__: Foo
>> a instanceof Foo
true
>> a.__proto__.constructor.name
"Foo"
>> a.__proto__.constructor.name = "NotFoo"
"NotFoo"
>> a
Foo {constructor: function}
>> a instanceof Foo
true

如果Chrome开发人员想让它完全无法覆盖,那么您可以看到他们如何根据webkit的instanceof实现进行检查...

和: How to check the class of an instance in Javascript?

答案 1 :(得分:0)

  

如何确定“类名”?

请参阅github上的Chromium源代码。

您也许可以回溯第一页(可能必须通过C代码)。

  

此外,是否可以控制或修改?

您可以使用.toString解析类的源代码,执行.replace更改名称,并评估修改后的源代码。现在,您已经有了该类的一个克隆,该克隆将正确显示在控制台检查器中。

如果您对此没有控制权(这是第三方类),则显然不要这样做,因为第三方代码可能引用了该类。它还创建一个重复的类;这会令人困惑。

但是,如果您要进行元编程恐怖表演(而不是例如从事某项工作或可能看到任何事情的任何事物……),请继续使用此功能。这是我个人尝试过的真实方法,直到出现一些更好的API。 = \

我不记得这样做是否会对性能产生影响

答案 2 :(得分:-1)

Javascript中的

函数可以有名称,当你这样定义时:

function myfunc(){}

就像你这样做:

var myfunc = function myfunc(){}

在这个函数中myfunc是你的函数的名字,它不是唯一的,它意味着你可以用同一个名字创建不同的函数,当然你最好不要这样做。当你定义你的功能时:

var myfunc = function(){}

你创建了一个没有任何名字的函数,这将是一个匿名函数,浏览器分析器没有任何东西可以显示你的函数名称或你提到的class