दिलचस्प पोस्ट
HTML5 लोकल स्टोरेज बनाम सत्र का भंडारण मैं वॉल्यूम पर केवल हटाए गए, परिवर्तित और बनाई गई फ़ाइलों का कैसे पता लगा सकता हूं? PHP का उपयोग करके क्लाइंट आईपी एड्रेस प्राप्त करें रिलेटिव लेआउट में प्रतिशत की चौड़ाई किसी भी डेटाबेस समर्थन के लिए ड्राइवर वर्ग जेनेरिक लेखन पायथन परिपत्र आयात करना? कैसे एक नियमित अभिव्यक्ति MySQL में जगह करने के लिए? स्टार्टअप पर एप्लिकेशन क्रैश – माइक्रोसॉफ्ट लापता। Visual Basic.PowerPacks एक फ़ील्ड या किसी अन्य (XOR) की उपस्थिति मान्य करें । सी बनाम बनाम। सीसी बनाम .सीपीपी बनाम। एचपीपी बनाम। एच बनाम। सीएक्स सामग्री प्रकार 'अनुप्रयोग / x-www-form-urlencoded; charset = UTF-8' @ अनुरोध के लिए समर्थित नहीं MultiValueMap कैसे MATLAB में कक्षा की एक सरणी preallocate करने के लिए? स्प्रिंग एमवीसी में स्थिर सामग्री को कैसे संभालना है? PHP में फार्म POST से कर्ल के माध्यम से फाइल भेजें कैसे एक datezone जागरूक स्ट्रिंग को dateatil बिना तारीख अजगर में कनवर्ट करने के लिए?

जावास्क्रिप्ट ECMAScript 6 में स्ट्रिंग से वस्तु बनाएं

मैं ईएस 6 का प्रयोग करके ऑब्जेक्ट फ़ैक्ट्री बनाना चाहता हूं लेकिन पुरानी शैली के वाक्यविन्यास नए के साथ काम नहीं करता।

मेरे पास अगला कोड है:

export class Column {} export class Sequence {} export class Checkbox {} export class ColumnFactory { constructor() { this.specColumn = { __default: 'Column', __sequence: 'Sequence', __checkbox: 'Checkbox' }; } create(name) { let className = this.specColumn[name] ? this.specColumn[name] : this.specColumn['__default']; return new window[className](name); // this line throw error } } let factory = new ColumnFactory(); let column = factory.create('userName'); 

मुझसे क्या गलती हुई है?

Solutions Collecting From Web of "जावास्क्रिप्ट ECMAScript 6 में स्ट्रिंग से वस्तु बनाएं"

उस वस्तु पर कक्षा के नाम न दें। वहां खुद को कक्षाएं रखो, ताकि आपको उन पर वैश्विक और सुलभ (ब्राउज़र में) window माध्यम से भरोसा न करना पड़े।

बीटीडब्ल्यू, इस फैक्ट्री को क्लास बनाने के लिए कोई अच्छा कारण नहीं है, आप शायद केवल एक बार (सिंगलटन) को इन्स्तायट करेंगे। बस इसे एक वस्तु बनाएं:

 export class Column {} export class Sequence {} export class Checkbox {} export const columnFactory = { specColumn: { __default: Column, // <-- __sequence: Sequence, // <-- __checkbox: Checkbox // <-- }, create(name, ...args) { let cls = this.specColumn[name] || this.specColumn.__default; return new cls(...args); } }; 

ऐसा करने का एक छोटा और गंदा तरीका है:

 function createClassByName(name,...a) { var c = eval(name); return new c(...a); } 

अब आप उस तरह एक वर्ग बना सकते हैं:

 let c = createClassByName( 'Person', x, y ); 

समस्या यह है कि वर्ग विंडो वस्तु के गुण नहीं हैं आप इसके बजाय अपनी कक्षाओं में "इंगित करने वाले" गुणों के साथ एक ऑब्जेक्ट प्राप्त कर सकते हैं:

 class Column {} class Sequence {} class Checkbox {} let classes = { Column, Sequence, Checkbox } class ColumnFactory { constructor() { this.specColumn = { __default: 'Column', __sequence: 'Sequence', __checkbox: 'Checkbox' }; } create(name) { let className = this.specColumn[name] ? this.specColumn[name] : this.specColumn['__default']; return new classes[className](name); // this line no longer throw error } } let factory = new ColumnFactory(); let column = factory.create('userName'); export {ColumnFactory, Column, Sequence, Checkbox}; 

उन लोगों के लिए जो ES6 का उपयोग नहीं कर रहे हैं और आप जानना चाहते हैं कि आप यहां स्ट्रिंग का उपयोग करके कक्षाएं कैसे बना सकते हैं, यह मैंने काम करने के लिए किया है।

 "use strict"; class Person { constructor(x, y) { this.x = x; this.y = y; } } window.classes = {}; window.classes.Person = Person; document.body.innerText = JSON.stringify(new window.classes["Person"](1, 2)); 

जैसा कि आप ऐसा करने का सबसे आसान तरीका देख सकते हैं, किसी ऑब्जेक्ट को क्लास को जोड़ना है।

यहां बेला है: https://jsfiddle.net/zxg7dsng/1/

यहां एक उदाहरण प्रोजेक्ट है जो इस दृष्टिकोण का उपयोग करता है: https://github.com/pdxjohnny/dist-rts-client-web

मैं इस विधि को पसंद करता हूं:

allThemClasses.js

 export class A {} export class B {} export class C {} 

script.js

 import * as Classes from './allThemClasses'; const a = new Classes['A']; const b = new Classes['B']; const c = new Classes['C'];