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似乎没有尝试在第二个示例中猜测“类名”。
答案 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
实现进行检查...
答案 1 :(得分:0)
如何确定“类名”?
请参阅github上的Chromium源代码。
您也许可以回溯第一页(可能必须通过C代码)。
此外,是否可以控制或修改?
您可以使用.toString解析类的源代码,执行.replace更改名称,并评估修改后的源代码。现在,您已经有了该类的一个克隆,该克隆将正确显示在控制台检查器中。
如果您对此没有控制权(这是第三方类),则显然不要这样做,因为第三方代码可能引用了该类。它还创建一个重复的类;这会令人困惑。
但是,如果您要进行元编程恐怖表演(而不是例如从事某项工作或可能看到任何事情的任何事物……),请继续使用此功能。这是我个人尝试过的真实方法,直到出现一些更好的API。 = \
我不记得这样做是否会对性能产生影响
答案 2 :(得分:-1)
函数可以有名称,当你这样定义时:
function myfunc(){}
就像你这样做:
var myfunc = function myfunc(){}
在这个函数中myfunc
是你的函数的名字,它不是唯一的,它意味着你可以用同一个名字创建不同的函数,当然你最好不要这样做。当你定义你的功能时:
var myfunc = function(){}
你创建了一个没有任何名字的函数,这将是一个匿名函数,浏览器分析器没有任何东西可以显示你的函数名称或你提到的class
。