使用变量字符串作为类名

时间:2019-07-16 15:38:26

标签: javascript eval

我想遍历现有类的列表并调用它们的方法。 简化版如下所示:

class Animal { 
  speak() {
    return this;
  }
}
const classNameStr = 'Animal';

eval(`${classNameStr}.prototype.speak()`);

但是eval()显然是不好的做法。有其他选择吗?

2 个答案:

答案 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();