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 似乎没有尝试猜测第二个示例中的“类名”。
最佳答案
Google Chrome 的官方网站对此没有帮助,但我向您指出了这一点:
How are javascript class names calculated for custom classes in Chrome Dev Tools?
我不认为你可以覆盖 chrome 控制台的“演绎”机制。
一些控制台游戏:
>>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
实现进行检查...
关于javascript - Chrome 调试器中显示的 "class name"是基于什么?可以控制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20668358/