2012-08-29 282 views
2

如果我定义和动态创建的类的实例象下面这样:创建类动态以JavaScript

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

然后animal1将在铬调试器的Object实例(但具有正确的属性)中示出被同时animal2将具有类型window.Animal

Animal被静态定义:

function Animal() {} 

两个对象被看作的Animal实例。

动态定义函数(不使用eval)时如何实现此目的?

+3

无法重现。 http://i.imgur.com/68DUI.png ..对我来说,它们都显示为'window.Animal'的实例。 – James

+0

我的不好,我已经过分简化了。似乎你需要在变量中重现类型名称。你可以再试一次吗? –

+1

更新后也无法重现。对我而言,这两个变量都具有'window。(匿名函数)'类型。 –

回答

1

什么样的浏览器控制台显示你似乎化妆品被确定:

  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';则不设置。

案例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”。

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