2011-02-22 40 views

回答

22

你可以試試這個:

var str = "MyClass"; 
var obj = new window[str]; 

下面是一個例子:

function MyClass() { 
    console.log("constructor invoked"); 
} 

var s = "MyClass"; 
new window[s]; //logs "constructor invoked" 
+4

+1對我來說沒有邪惡。 – user113716 2011-02-22 23:18:20

+3

完美,謝謝! 編輯:哦,我可以把類定義到一個對象,而不是使用窗口對象... – kubi 2011-02-23 10:43:07

5

創建對象(調用構造函數)通過​​反射:

SomeClass = function(arg1, arg2) { 
    // ... 
} 

ReflectUtil.newInstance('SomeClass', 5, 7); 

和實施:

/** 
* @param strClass: 
*   class name 
* @param optionals: 
*   constructor arguments 
*/ 
ReflectUtil.newInstance = function(strClass) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    var clsClass = eval(strClass); 
    function F() { 
     return clsClass.apply(this, args); 
    } 
    F.prototype = clsClass.prototype; 
    return new F(); 
}; 
+6

'eval()'==糟糕。 – 2012-01-17 16:46:37

+3

如果您沒有正確驗證字符串是否爲'eval'ed,那麼*僅* *很糟糕。除此之外,這個答案很棒。目前接受的答案*只適用於全球可訪問的類別(即在窗口級別)。例如,在閉包中定義的類不能使用'window'方法實例化。 – 2014-06-18 23:34:13

+0

@ElliotB。在這種情況下,您可以使用'this'來引用當前範圍。 la'new this [className]' – 2014-06-19 16:28:34