दिलचस्प पोस्ट
एक पॉलीविरिएडिक हैस्केल फ़ंक्शन कैसे बनाएं? जावास्क्रिप्ट autobox करता है? एसक्यूएल क्वेरी से परिणाम मुझे उम्मीद के अनुसार वापस क्यों नहीं आते हैं? बीबीसीडी को पार्स करने का सर्वोत्तम तरीका org.apache.tomcat.util.bcel.classfile.ClassFormatException: निरंतर पूल में अमान्य बाइट टैग: 15 – टोमेट 7, जेडीके इनकॉमीटीबिलीटी? सी # में समानांतर थ्रेड्स की संख्या को सीमित करें एंड्रॉइड में स्टेटस बार की ऊंचाई पायथन में दो दशमलव स्थानों के साथ एक फ्लोट प्रदर्शित करें सी में एक डेटाबेस के लिए एकाधिक पैरामीटर वाला चर जोड़ना क्या करता है। कंटेनर। \ 31 25 \ 25 सीएसएस में क्या मतलब है? Git में दिए गए कमांड का प्रिंट संदेश भेजें लोड होने पर किसी खास स्थिति में एचटीएमएलएक्स वीडियो शुरू करें? वास्तविक समय पुश अधिसूचना के पास एंड्रॉइड समर्थन क्या है? एक कतार का उपयोग करके निर्माता / उपभोक्ता थ्रेड्स कैसे "अनदेखा डालें" और "डुप्लिकेट कुंजी अद्यतन पर" (एसक्यूएल मर्ज) का अनुकरण कैसे करना है postgresql?

जावास्क्रिप्ट 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'); 

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

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट 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'];