2012-08-29 165 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」。

請注意,這些控制檯化妝品不會影響程序的功能,因爲所有對象/原型功能仍按預期工作。