javascript:动态创建类实例

javascript:动态创建类实例,javascript,class,Javascript,Class,我正在编写一个应用程序,其功能可以通过config.json打开和关闭,如下所示: "appFeatures": { "header": { "create": true, "title": "Here Comes the Sun" }, "imageStrip": { "create": false, "imageDirectory": "../data/images", "imageDimensions":

我正在编写一个应用程序,其功能可以通过
config.json
打开和关闭,如下所示:

"appFeatures": {
    "header": {
      "create": true,
      "title": "Here Comes the Sun"
    },
    "imageStrip": {
      "create": false,
      "imageDirectory":  "../data/images",
      "imageDimensions": [288, 162]
    },
    "areaChart": {
      "create": true
    },
    "axes": {
      "create": true
    }
}
对于每个功能,已经有一个实现该功能的同名对应类。我想使用该特性的名称来创建该类的新实例。获取
config.json
后,我得到了如下代码(在
Main.js
类中):

this.features = Object.entries(this.config.appFeatures)
  .filter((entry) => {
    return entry[1].create === true;
  });

this.features.forEach((feature) => { this.createFeatureInstances(feature[0]); });
然后我尝试创建实例,一个la
this.header=newheader()

这将创建一个新的、空的
类,我想它就是一个实例。它不是我已经编写并希望为其创建实例的Header类。如何编写
createFeatureInstances
函数,以便创建与某个功能对应的每个类的实例


编辑由于其他人将来可能会向此应用程序添加新功能,因此我希望尽可能减少对应用程序可用的功能进行硬编码的时间。在我当前的设计中,另一个开发人员可以通过编写一个新的功能类来添加另一个功能,将该类导入Main.js类,并将配置条目弹出到config.json中,而无需接触代码中的任何其他内容。出于这个原因,像这样的解决方案:不会给我一个解决方案,因为它们依赖于拥有一个应该已经存在的类的完整列表。

您可以使用以下代码段使用字符串初始化一个cooResponse(有效且存在)类:

var dynamicClassInstance = new this[classNameString]();

您需要在某个地方有一个名称类映射。工厂功能或其他地方是您的电话。您当前的解决方案缺少这一点,这导致了问题:

…创建一个新的空头类,我想它是一个实例。它不是我已经编写并希望为其创建实例的Header类

用一个简单的例子作一些解释

//假设您已经定义了测试
课堂测试{
callMe(){}
}
//您的消费者希望创建一个类名测试
const className=“测试”;
//这是名称到类的简单映射
常量nameToClass={
“测试”:测试
}
//这将创建一个名为Test的新类,而不是您定义的类
const AttemptedDynamicTest=新函数(`
返回类${className}{}
`)();
//接下来的两个日志正好证明了前面的评论
console.log(Test==AttemptedDynamicTest);//假的
console.log(AttemptedDynamicTest.prototype.callMe的类型);//未定义
//您真正需要的是维护一个地图,并使用它动态地
//每次创建一个新实例

console.log(typeof nameToClass[className].prototype.callMe);//函数
可能的重复项您需要在某个地方有一个名称类映射。工厂功能或其他地方是您的电话。您当前的解决方案缺少这一点,这导致了问题:“……创建了一个新的空头类,我想它是实例。这不是我已经编写的头类,我想为“@MaazsYedEdeeb”创建一个实例,感谢您让我知道这一点。我想这就是答案。如果你想寄,我会接受的。例如,我通过
import Feature1 from./features/Feature1.js
将功能模块导入
Main.js
。根据您的回答,我现在在
Main.js
的构造函数中包含以下内容:
this.Feature1=Feature1
。然后我可以使用
this[
${featureName}
]=newthis[
${className}
])和所有按需工作。我的下一个问题是,当我使用
this[
${featureName}
]=newthis[className]()我得到以下错误:
TypeError:this[className]不是构造函数
var dynamicClassInstance = new this[classNameString]();