Chrome调试器中显示的“类名”基于什么?能控制吗?
What is the "class name" shown in Chrome's debugger based on? Can it be controlled?
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似乎没有尝试猜测第二个示例中的"类名"。
谷歌浏览器的官方网站对此没有帮助,但我指出你这个 SO:
如何在 Chrome Dev Tools 中为自定义类计算 JavaScript 类名称?
我认为你不能覆盖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中检查实例的类?
这个"类名"是如何确定的?
请参阅 github 上的 Chromium 源代码。
- 控制台目录-ES6 测试用例
- 预期输出(2022 年更新:我无法在 HEAD 中找到此文件的最新版本 - 但您可以使用它来确定是否可以根据需要调整调试器输出)
您也许可以回溯第一页(可能必须通过 C 代码)。
而且,进一步,是否可以控制或修改?
您可以使用 .toString 解析类的源代码,执行 .replace 以更改名称,并评估修改后的源代码。现在,您有一个将在控制台检查器中正确显示的类克隆。
如果您无法控制此类(它是第三方类),显然不要这样做,因为第三方代码可能引用了该类。此外,它还创建了一个重复的类;这会令人困惑。
但是,如果你正在做一个元编程恐怖节目(而不是例如为了工作或任何可能看到曙光的东西......),请继续使用它。这是我个人尝试过的方法,直到出现一些更好的API。=''
我不记得这样做是否对性能有影响
Javascript 中的函数可以有名称,当你像这样定义它时:
function myfunc(){}
这与您执行的操作相同:
var myfunc = function myfunc(){}
在这个函数中,myfunc
是你的函数的名称,这不是唯一的,这意味着你可以使用相同的名称创建不同的函数,当然你最好不要这样做。 当你定义你的函数时,比如:
var myfunc = function(){}
您创建了一个没有任何名称的函数,这将是一个匿名函数,浏览器分析器不会向您显示函数的名称或您提到的class
。
- 什么's是相当于LINQ's SelectMany运算符
- 什么是 .ajax() 等价于 .load()
- 我应该在Google Api javascript中进行什么更改,以便它只能显示印度城市,而不能落后于州和印度
- 使悬停菜单适用于移动设备的最佳实践方法是什么?
- 什么's相当于AngularJS中的jQuery.one()
- 在纯JavaScript中,jQuery的.height()和.width()等价于什么
- 什么是等效于jQuery's.contents()
- dojo中的require()和define()函数的主要区别是什么?我们什么时候使用它们
- setAutoGrow()只适用于应用程序的第一页,这有什么错
- 在 JavaScript 中相当于什么
- 什么是 FORM 相当于 DOM 的 getNextSibling
- 就像话语之于Ember.js,什么是一些大型开源项目编写的rails + angularjs
- 什么是 JavaScript 相当于 php 的FILTER_SANITIZE_STRING
- 什么是节点.js相当于窗口[“myvar”] = 值
- 专注于第一个表单元素,无论它是什么.j查询对话框
- jQuery UI - 这相当于什么
- 铯API的克隆和开发如何使用需要依赖于什么是铯
- JavaScript中数组和集合的区别是什么,什么时候我应该选择一个而不是另一个
- 提供给insertCS()的文件路径应该是相对于什么的
- eslint中的jscs ' disallowKeywordsOnNewLine '相当于什么?