我希望能够以new编程方式调用事物。例如,如果我有这两个类:
class Bird
   constructor: (@name) ->
class Snake
   constructor: (@name) ->
我可以打电话s = new Snake("Sam")。现在,我想做的是
bird_class = "Bird"
b = new bird_class()
并且能够从字符串构造一个鸟对象。这在 CoffeeScript 或 Javascript 中可行吗?
我希望能够以new编程方式调用事物。例如,如果我有这两个类:
class Bird
   constructor: (@name) ->
class Snake
   constructor: (@name) ->
我可以打电话s = new Snake("Sam")。现在,我想做的是
bird_class = "Bird"
b = new bird_class()
并且能够从字符串构造一个鸟对象。这在 CoffeeScript 或 Javascript 中可行吗?
如果你将你的类保存在一个对象中,你总是可以:
var animals = {
  Snake: Snake,
  Bird: Bird
};
new animals["Snake"]();
根据您的评论,像这样的一些模式可以让您即时注册课程。它是原始的,但可能会给你一个想法:
var zoo = {
  animals: {},
  add: function (animal) {
    this.animals[animal.name] = animal;
  },
  make: function(name) {
    if (this.animals[name]) {
      return new this.animals[name]();
    }
  }
};
function Snake() {};
zoo.add(Snake);
var snake = zoo.make('Snake');
我不是 Coffeescripter,但在 JavaScript 中你可以这样做:
 function MyClass() { ... constructor ... };
 function MyOtherClass() { ... other constructor ... };
 var theConstructor = something ? MyClass : MyOtherClass;
 var obj = theConstructor();
您可以获取对构造函数的引用并将其视为一个值,随心所欲地处理它。
如果你想按名字来做,那有点棘手。缺少使用eval()(如果你愿意,你可以这样做,并且如果你可以确定它对你的项目没有风险),那么不可能在 JavaScript 中获得对符号的引用。但是,如果它是对对象属性的引用,它确实有效。