我希望能够以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 中获得对符号的引用。但是,如果它是对对象属性的引用,它确实有效。