यह संभव बुराई eval के बिना इस तरह कुछ करने के लिए है:डायनामिक क्लासनाम से ऑब्जेक्ट बनाएं - जेएस में रिफ्लेक्शन क्लास?
var str='MyClass';
eval('new '+str);
मैं अभी सीखा है कि वहाँ PHP में ReflectionClass ... धन्यवाद।
यह संभव बुराई eval के बिना इस तरह कुछ करने के लिए है:डायनामिक क्लासनाम से ऑब्जेक्ट बनाएं - जेएस में रिफ्लेक्शन क्लास?
var str='MyClass';
eval('new '+str);
मैं अभी सीखा है कि वहाँ PHP में ReflectionClass ... धन्यवाद।
आप इस कोशिश कर सकते:
var str = "MyClass";
var obj = new window[str];
यहाँ एक उदाहरण है:
function MyClass() {
console.log("constructor invoked");
}
var s = "MyClass";
new window[s]; //logs "constructor invoked"
वस्तु (निर्माता आह्वान) प्रतिबिंब के माध्यम से बनाएँ:
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();
};
'eval()' == खराब। –
यह * केवल * खराब है यदि आप 'eval'ed' स्ट्रिंग को सही तरीके से मान्य नहीं करते हैं। इसके अलावा, यह जवाब बहुत अच्छा है। वर्तमान में स्वीकृत उत्तर * केवल * काम करता है यदि कक्षा विश्व स्तर पर पहुंच योग्य है (यानी, विंडो स्तर पर)। उदाहरण के लिए बंद होने के भीतर परिभाषित कक्षाओं को 'विंडो' विधि का उपयोग करके तत्काल नहीं किया जा सकता है। –
@ElliotB। उस स्थिति में, आप मौजूदा दायरे को संदर्भित करने के लिए 'this' का उपयोग कर सकते हैं। एक ला 'नया [वर्गनाम] ' –
+1 मुझे बुराई से रहित लगता है। – user113716
सही, धन्यवाद! संपादित करें: ओह, और मैं विंडो ऑब्जेक्ट का उपयोग करने के बजाय क्लास परिभाषाओं को ऑब्जेक्ट में डाल सकता हूं ... – kubi