如果我动态定义和创建类的实例,如下所示:
var type = 'Animal';
window[type] = function() {};
var animal1 = new window[type]();
var animal2 = new Animal();
然后animal1
将在Chrome调试器中显示为Object
的实例(但具有正确的属性),而animal2
的类型为window.Animal
。
静态定义Animal
时:
function Animal() {}
这两个对象都被视为Animal
的实例。
如何在动态定义函数时(不使用eval)实现此目的?
答案 0 :(得分:1)
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';
不设置。{/ p>
案例2:
var ClassA = function() {};
ClassB = ClassA;
new ClassB();
// reports a `ClassA` object
构造函数最初被分配给ClassA
,因此该名称似乎被烧入构造函数中,即使它在另一个变量别名下使用。实际上,执行delete 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
”类型。
请注意,这些控制台化妆品不会影响程序的功能,因为所有对象/原型功能仍然按预期工作。