首页 > 解决方案 > 使用变量字符串作为类名

问题描述

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

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

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

但是 eval() 显然是不好的做法。有替代方案吗?

标签: javascripteval

解决方案


你不需要评估,你需要对象。

"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();

推荐阅读