2011-02-22 12 views

cevap

22

Bu deneyebilirsiniz: Burada

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

bir örnek:

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

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

+1 Bana kötülükten uzak görünüyor. – user113716

+3

Mükemmel, teşekkürler! DÜZENLEME: ooh ve sınıf nesnelerini pencere nesnesini kullanmak yerine bir nesneye koyabilirim ... – kubi

5

yansıma yoluyla nesne (yapıcı çağırmak) oluşturun:

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

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

ve uygulama:

/** 
* @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()' == bad. –

+3

* Değerlendirilen dizeyi doğru şekilde doğrulamazsanız yalnızca * hatalı. Bunun dışında, bu cevap harika. Geçerli kabul edilen cevap * sadece *, sınıf küresel olarak erişilebilirse (yani, pencere düzeyinde) çalışır. Örneğin, kapaklar içinde tanımlanan sınıflar, 'window' yöntemi kullanılarak başlatılamaz. –

+0

@ElliotB. Bu durumda, mevcut kapsamı referans almak için 'this' kullanabilirsiniz. Bu yeni bir [yeni adı] –

İlgili konular