2

如果我动态定义和创建类的实例,如下所示:

var type = 'Animal';
window[type] = function() {};
var animal1 = new window[type]();
var animal2 = new Animal();

然后animal1将在 Chrome 调试器中显示为Object(但具有正确属性)的实例,而animal2将具有 type window.Animal

何时Animal静态定义:

function Animal() {}

这两个对象都被视为Animal.

如何在动态定义函数(不使用 eval)时实现这一点?

4

1 回答 1

1

Chrome 控制台向您显示的外观似乎由以下因素决定:

  1. 构造函数的name属性,或
  2. 构造函数最初分配给的变量名称(如果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”。

请注意,这些控制台装饰不会影响程序的功能,因为所有对象/原型功能仍按预期工作。

于 2012-08-29T18:21:49.513 回答