Create an instance of a class in ES6 with a dynamic name? [duplicate] Create an instance of a class in ES6 with a dynamic name? [duplicate] javascript javascript

Create an instance of a class in ES6 with a dynamic name? [duplicate]


There are a few ways you can accomplish this...

1. Proxy Class

Following from @thefourtheye's example of maintaining a mapping of name to class, you could have a class whose job is to take the name of the desired class and proxy its instantiation:

[ See it working ]

Define your classes

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

Define the proxy class (e.g. 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 classes themselvesconst classes = {    ClassOne,    ClassTwo};class DynamicClass {    constructor (className, opts) {        return new classes[className](opts);    }}export default DynamicClass;

Example usage

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

2. Factory Function

Use a function that performs a lookup against an object of class name -> class mappings and returns reference to the class, which we can then instantiate as usual.

Define the factory function

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

Example usage

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


Store the classes in an Object, with the keys being the names of the classes you want them to be.

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

then create the class based on the key name like this

return new classesMapping[desiredSubclassName](args);