Creare un’istanza di una class in ES6 con un nome dinamico?

Voglio essere in grado di creare un’istanza di una particolare class ES6 passando una variabile stringa a una funzione. A seconda del valore della variabile, verrà creata una class diversa.

Esempio : ho 2 classi, ClassOne , ClassTwo . Voglio essere in grado di passare una variabile a una funzione e ottenere un nuovo corso. Il nome della class sarà correlato alla variabile – ad es. passare 'Two' creerà ClassTwo .

Non voglio usare solo una clausola switch come questa:

 function createRelevantClass( desiredSubclassName ) { let args = [], newClass; switch( desiredSubclassName ) { case 'One' : newClass = new ClassOne(args); break; case 'Two' : newClass = new ClassTwo(args); break; } return newClass; } 

Invece, voglio in qualche modo essere in grado di creare la chiamata del costruttore usando il nome della variabile. È ansible?

 function createRelevantClass( desiredSubclassName ) { // desiredSubclassName would be string 'One' or 'Two' // how to use the 'new' operator or Reflect here to create the class based on the variable passed in let newClass = ( *magic code to build constructor dynamically* ); return newClass; } 

Ci sono alcuni modi in cui puoi realizzare questo …

1. Classe proxy

Seguendo l’esempio di @ thefourtheye di mantenere un mapping di nome in class, potresti avere una class il cui compito è prendere il nome della class desiderata e proxy la sua istanza:

[ Vedi funziona ]

Definisci le tue classi

 // ClassOne.js export class ClassOne { constructor () { console.log("Hi from ClassOne"); } } // ClassTwo.js export class ClassTwo { constructor (msg) { console.log(`${msg} from ClassTwo`); } } 

Definire la class del proxy (ad es. DynamicClass )

 import ClassOne from './ClassOne'; import ClassTwo from './ClassTwo'; // Use ES6 Object Literal Property Value Shorthand to maintain a map // where the keys share the same names as the classs themselves const classs = { ClassOne, ClassTwo }; class DynamicClass { constructor (className, opts) { return new classs[className](opts); } } export default DynamicClass; 

Esempio di utilizzo

 import DynamicClass from './DynamicClass'; new DynamicClass('ClassOne'); //=> "Hi from ClassOne" new DynamicClass('ClassTwo', 'Bye'); //=> "Bye from ClassTwo" 

2. Funzione di fabbrica

Utilizzare una funzione che esegue una ricerca rispetto a un object di nome class -> mapping di classi e restituisce riferimento alla class, che è quindi ansible creare un’istanza come al solito.

Definire la funzione di fabbrica

 import ClassOne from './ClassOne'; import ClassTwo from './ClassTwo'; const classs = { ClassOne, ClassTwo }; export default function dynamicClass (name) { return classs[name]; } 

Esempio di utilizzo

 import dynamicClass from './dynamicClass' const ClassOne = dynamicClass('ClassOne') // Get the ClassOne class new ClassOne(args) // Create an instance of ClassOne 

Memorizza le classi in un object, con le chiavi come nomi delle classi che vuoi che siano.

 const classsMapping = { 'One': ClassOne, 'Two': ClassTwo }; 

quindi creare la class in base al nome della chiave come questo

 return new classsMapping[desiredSubclassName](args);