2009-05-28 71 views
5

如何通過拋出變量名來實例化一個類? 考慮這個方法的類中:通過變量動態實例化一個類

animate: function(el, build) { 
     console.log(build.effect); 
     var animationClass = new build.effect(el,build); 
}, 

版本是包含的東西很多對象,但最重要的 「效果」。這個效果是一個獨立動畫類的名字 - 一個叫做「MarioKartMenu」。

console.log(build.effect)打印出「MarioKartMenu」。 但我當然得到:TypeError:表達式'build.effect'的結果[MarioKartMenu]不是構造函數。

如果我垃圾的活力,只是使代碼爲這樣:

animate: function(el, build) { 
     var animationClass = new MarioKartMenu(el,build); 
    }, 

它工作得很好。是否有可能使它像我試圖做的那樣動態?

回答

5

如果函數MarioKartMenu在全球範圍內被定義,你可以通過它的字符串名稱使用訪問:

window["MarioKartMenu"] 

這工作,因爲所有的全局變量是window對象的屬性。

鑑於上述情況,你可以實現你想要的使用:

var menuConstructor = window[build.effect]; 
var animationClass = new menuConstructor(el, build); 
+0

完美,我有它感覺它看起來類似的東西。謝謝。 – 2009-05-28 22:53:10

+0

如果它是在一個js類中,你可以使用**這個[「MarioKartMenu」] **。我對此感到一陣子並想出了它! – IJas 2014-03-23 09:04:04

0

我首先想到的是使用JavaScript的eval()運營商,雖然我知道這是一個不到完美的解決方案。 (像這樣的東西:var animationClass = eval("new "+build.effect+"(el, build)");雖然我不確定這是否正確,因爲我之前沒有使用過這種類型的eval())。艾曼的回答是這個想法的一個更好的變化。

我的第二個想法是MarioKartMenu是不適當的抽象。所以我會圍繞它構建一個簡單的類,它將效果名稱作爲第三個參數,並使用switch()語句在所有可用效果中進行選擇,然後實例化正確的效果並將其返回。

+0

好的建議。最後,我不知道會有什麼效果,因爲調用動畫類的類將完全可擴展,以允許任何人創建和使用他們自己的動畫。所以switch語句不起作用。 – 2009-05-28 22:59:38

2

剛分配構造函數build.effect(不包含其名稱的字符串),它應該工作:

animate = function(el, build) { 
    var animationClass = new build.effect(el,build); 
} 
// ... 

b = ...; 
b.effect = MarioKartMenu; 
animate(e, b);