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]); });
然后我尝试创建实例,一个lathis.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]();