动态实例化功能&在JavaScript中调用方法

时间:2015-05-29 16:49:32

标签: javascript

参加这个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中是否可行,或者我是以错误的方式解决这个问题?

4 个答案:

答案 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]]();