参加这个JavaScript课程:
var Foo = function() {
this.bar = function() {
return 'foobar';
};
};
我可以实例化这个类并将其称为bar
方法,如下所示:
(new Foo).bar();
我想基于表示类Foo@bar
的类和方法的字符串动态地实现类和它的方法的实例化和调用。
我已尝试以下操作来实现此目的但收到错误Uncaught TypeError: string is not a function
:
var action = 'Foo@bar';
var classMethod = action.split('@');
(new classMethod[0]).call(classMethod[1]);
这在JavaScript中是否可行,或者我是以错误的方式解决这个问题?
答案 0 :(得分:1)
你可以用eval做点什么。但我不会表明这是因为eval是邪恶的。
如果您愿意创建包含可以创建的类型的对象:
var Foo = function() {
this.bar = function() {
return 'foobar';
};
};
var types = {
Foo : Foo
};
var action = 'Foo@bar';
var classMethod = action.split('@');
(new types[classMethod[0]])[classMethod[1]]();
您的代码存在的问题是classMethod[0]
是一个字符串。但是要使用new
,你需要赋予它一个功能。
在我的代码中,我使用javascript的[]
运算符,它使用包含属性名称的字符串访问对象的属性。
首先,我使用它从类型对象获取Foo属性。这是你的构造函数。
然后在调用构造函数之后,我再次使用[]
运算符来获取bar属性。
答案 1 :(得分:0)
假设您有一个Foo
对象
var foo = new Foo();
您可以说foo["bar"]();
在其上调用名为bar
的方法。
答案 2 :(得分:0)
要按名称访问构造函数,您需要在某些集合中访问它。例如:
var Foo = function() {
this.bar = function() {
return 'foobar';
};
};
var constructors = {
Foo: Foo,
Bar: Bar
};
function instantiateAndInvoke(action) {
var classMethod = action.split('@');
var constr = constructors[classMethod[0]];
var instance = new constr();
return instance[classMethod[1]]();
}
// and then
var result = instantiateAndInvoke('Foo@bar');
答案 3 :(得分:0)
classMethod[0]
是一个字符串,因此您无法将其用作构造函数。
假设Foo
是一个全局函数,
new window[classMethod[0]]()[classMethod[1]]();