我想遍历现有类的列表并调用它们的方法。 简化版如下所示:
class Animal {
speak() {
return this;
}
}
const classNameStr = 'Animal';
eval(`${classNameStr}.prototype.speak()`);
但是eval()显然是不好的做法。有其他选择吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
您不需要评估,您需要对象。
"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();