Chrome 控制台向您显示的外观似乎由以下因素决定:
- 构造函数的
name
属性,或
- 构造函数最初分配给的变量名称(如果
name
未设置)。
情况1:
var ClassA = function ClassB() {};
new ClassA();
// reports a `ClassB` object
构造函数的name
属性设置为ClassB
,这就是 Chrome 报告的内容。函数的name
只能在定义时设置,因此function funcName(){}
设置name
,而func=function(){}; f.name='funcName';
不能。
案例二:
var ClassA = function() {};
ClassB = ClassA;
new ClassB();
// reports a `ClassA` object
构造函数最初分配给ClassA
,因此该名称似乎被烧入构造函数中,即使它在另一个变量别名下使用也是如此。事实上,doingdelete window.ClassA
并不会阻止新构造的对象将自己报告为 ClassA 对象:
var ClassA = function() {};
ClassB = ClassA;
delete window.ClassA;
new ClassB();
// still reports a `ClassA` object
// even though `ClassA` is no longer a defined variable name
这就是您的“动态定义”案例中发生的事情。第一window[type] = function() {};
行将构造函数的结果对象永久标记为类型“ anonymous function that's a property of window
”。
请注意,这些控制台装饰不会影响程序的功能,因为所有对象/原型功能仍按预期工作。