在Coffeescript中以编程方式调用“new”

时间:2013-01-20 01:24:51

标签: javascript coffeescript

  

可能重复:
  How do I make JavaScript Object using a variable String to define the class name?

我希望能够以编程方式调用new。例如,如果我有这两个类:

class Bird
   constructor: (@name) ->

class Snake
   constructor: (@name) ->

我可以致电s = new Snake("Sam")。现在,我想做的是

bird_class = "Bird"
b = new bird_class()

并且能够从字符串构造鸟对象。这可能在CoffeeScript或Javascript中吗?

2 个答案:

答案 0 :(得分:2)

如果你将课程保存在一个对象中,你可以随时:

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');

答案 1 :(得分:0)

我不是Coffeescripter,但在JavaScript中你可以这样做:

 function MyClass() { ... constructor ... };
 function MyOtherClass() { ... other constructor ... };

 var theConstructor = something ? MyClass : MyOtherClass;

 var obj = theConstructor();

你可以抓住对构造函数的引用并将其视为一个值,然后随意处理它。

如果你想通过 name 来做,那么,这有点棘手。没有使用eval()(如果你愿意,你可以做,如果你可以确定它对你的项目没有风险),那么就不可能在JavaScript中获得像这样的引用。但它确实有效,如果它是对象属性的引用。