Javascript 在ES6中创建具有动态名称的类实例?

Javascript 在ES6中创建具有动态名称的类实例?,javascript,class,dynamic,ecmascript-6,Javascript,Class,Dynamic,Ecmascript 6,我希望能够通过向函数传递字符串变量来实例化特定的ES6类。根据变量的值,将创建不同的类 示例-我有两个类,ClassOne,ClassTwo。我希望能够将一个变量传递给函数并返回一个新类。类的名称将与变量相关-例如,传递'Two'将创建ClassTwo 我不想使用这样的switch子句: function createRelevantClass( desiredSubclassName ) { let args = [], newClass; switch( desired

我希望能够通过向函数传递字符串变量来实例化特定的ES6类。根据变量的值,将创建不同的类

示例-我有两个类,
ClassOne
ClassTwo
。我希望能够将一个变量传递给函数并返回一个新类。类的名称将与变量相关-例如,传递
'Two'
将创建
ClassTwo

我不想使用这样的
switch
子句:

function createRelevantClass( desiredSubclassName )
{
  let args = [],
      newClass;

  switch( desiredSubclassName )
  {
    case 'One' :
      newClass = new ClassOne(args);
      break;
    case 'Two' :
      newClass = new ClassTwo(args);
      break;
  }

  return newClass;
}
相反,我希望能够以某种方式使用变量名创建构造函数调用。可能吗

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;
}

将类存储在对象中,键是您希望它们成为的类的名称

const classesMapping = {
  'One': ClassOne,
  'Two': ClassTwo
};
然后根据键名创建类,如下所示

return new classesMapping[desiredSubclassName](args);

有几种方法可以做到这一点

1.代理类 根据@thefourtheye维护名称到类的映射的示例,您可以拥有一个类,其任务是获取所需类的名称并代理其实例化:

[]

定义您的课程

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

// ClassTwo.js
export class ClassTwo {
    constructor (msg) {
        console.log(`${msg} from ClassTwo`);
    }
}
定义代理类(例如
动态类

示例用法

import DynamicClass from './DynamicClass';

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

const ClassOne = dynamicClass('ClassOne') // Get the ClassOne class

new ClassOne(args) // Create an instance of ClassOne
2.工厂功能 使用一个函数对类名->类映射的对象执行查找,并返回对该类的引用,然后我们可以像往常一样实例化该类

定义工厂功能

import ClassOne from './ClassOne';
import ClassTwo from './ClassTwo';

const classes = { ClassOne, ClassTwo };

export default function dynamicClass (name) {
  return classes[name];
}
示例用法

import DynamicClass from './DynamicClass';

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

const ClassOne = dynamicClass('ClassOne') // Get the ClassOne class

new ClassOne(args) // Create an instance of ClassOne

@不。不一定,谢谢。经过深思熟虑,这是有道理的,因为模块必须在某个阶段导入,例如@RGraham Oh,该站点看起来不错:-)谢谢:-)大开眼界。。谢谢但是,如果所需的子类名实际上已经与类名相同,该怎么办?将“ClassOne”映射到ClassOne对我来说似乎有点多余。如果您有任何建议,我将不胜感激。@bertie如果您使用ES6,这是可能的。有一个快捷方式,{Foo':Foo}可以写为{Foo}我喜欢这个,因为我不必显式地构建变量到类的映射-只要有一个常量和一组要构造的类就足够了@Fourtheye的例子很简洁,但我认为这更接近我想要做的,实际上它不必是一个类。它可以是一个简单的工厂函数。我觉得上课有点过分。@thefourtheye是的,当然不是唯一的方法。:-)最后,我结合了这两个函数——一个简单的工厂函数,它使用类引用的非映射常量。谢谢你们两位的大力帮助。我不同意这种做法。返回值不应该是类,但是应该是工厂请求的类的对象。请查看以下链接: