javascript - 使用变量字符串作为类名
问题描述
我想遍历现有类的列表并调用它们的方法。简化版如下所示:
class Animal {
speak() {
return this;
}
}
const classNameStr = 'Animal';
eval(`${classNameStr}.prototype.speak()`);
但是 eval() 显然是不好的做法。有替代方案吗?
解决方案
你不需要评估,你需要对象。
"use strict";
const animalClasses = {
Animal: class {
speak() {
return this;
}
},
Wolf: class extends Animal {
speak() {
console.log("Wooooooooo");
return super.speak();
}
}
};
function speakAnimal(classNameStr) {
animalClasses[classNameStr].prototype.speak();
}
然而,通过这样的原型调用方法很容易出错并且很奇怪。
我们可以而且应该将其修改为
function speakAnimal(classNameStr) {
const animal = new animalClasses[classNameStr];
animal.speak();
}
更一般地说,一个人会写类似
"use strict";
const createAnimal = (function() {
const animalClasses = {
Animal: class {
speak() {
return this;
}
},
Wolf: class extends Animal {
speak() {
console.log("Wooooooooo");
return super.speak();
}
}
};
return function (animalName) {
return new animalClasses[animalName];
}
}());
然后像这样消费
const name = "Wolf"
const animal = createAnimal(name);
animal.speak();
推荐阅读
- serial-port - 打开一个串口,在 txd、dtr 和 rts 上传输
- spring - Spring boot @Decimalmin 和 @Decimalmax 在请求中不起作用
- python - 我怎么知道要使用什么类型的浮点数?
- azure-cdn - Azure CDN 重定向到 Azure Function
- r - 如何根据用户输入在 Shiny 的棒棒糖图中排序数据?
- mysql - 如何改进这种无模式数据库模式?
- php - 获取无效的 JSON 响应
- javascript - node.js & EJS:在 APP.JS app.get 中不起作用
- android - android toast 没有显示(虽然另一个显示)
- python - 日期时间字段的本地时间