2011-02-22 12 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

+3

सही, धन्यवाद! संपादित करें: ओह, और मैं विंडो ऑब्जेक्ट का उपयोग करने के बजाय क्लास परिभाषाओं को ऑब्जेक्ट में डाल सकता हूं ... – kubi

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()' == खराब। –

+3

यह * केवल * खराब है यदि आप 'eval'ed' स्ट्रिंग को सही तरीके से मान्य नहीं करते हैं। इसके अलावा, यह जवाब बहुत अच्छा है। वर्तमान में स्वीकृत उत्तर * केवल * काम करता है यदि कक्षा विश्व स्तर पर पहुंच योग्य है (यानी, विंडो स्तर पर)। उदाहरण के लिए बंद होने के भीतर परिभाषित कक्षाओं को 'विंडो' विधि का उपयोग करके तत्काल नहीं किया जा सकता है। –

+0

@ElliotB। उस स्थिति में, आप मौजूदा दायरे को संदर्भित करने के लिए 'this' का उपयोग कर सकते हैं। एक ला 'नया [वर्गनाम] ' –

संबंधित मुद्दे