在对象中调用javascript动态方法

时间:2012-10-03 10:10:21

标签: javascript jquery

如果我使用以下两种方法创建一个类:

var Car = function() {}
Car.prototype = {
    run: function() {
        alert('run');
    },
    stop: function() {
        alert('stop');
    }
}

当DOM准备就绪时,将调用test()方法,
并且这个test()方法将创建Car的实例并调用Car的方法

$(document).ready(function() {
    test("run");
});
function test(method) {
    var instance = new Car();
    // call instance.run()
}

我知道我必须使用apply()方法,
但我已经尝试了很多次但都失败了 那么,我如何在Object中使用apply()方法?

5 个答案:

答案 0 :(得分:2)

javascript中的对象是一个关联数组,因此您可以使用[]运算符通过字符串来解析对象的任何成员,也可以运行。

function test(method) {
    var instance = new Car();
    instance[method]();
}

这将允许通过名称在对象Car上调用函数。

See it working on JsFiddle

被调用方法中的上下文将正确地指向新创建的Car实例而无需任何额外的努力,我想这就是你想要的。当您需要将默认的“apply”值更改为其他值时,通常会使用callthis

答案 1 :(得分:1)

  

我知道我必须使用apply()方法,

你没有。取消注释instance.run()代码,调用test()方法并且它可以工作。

演示:http://jsfiddle.net/JkAnb/

  

如何在Object

中使用apply()方法

这取决于你想要达到的目标。有documentation at MDN

答案 2 :(得分:1)

也许你想打电话

  

instance.method()

动态调用,即基于传递的运行/停止值。你可以试试这个 -

  

实例[方法] .CALL(实例)

  

实例[方法]。适用(例如)

其中instance作为作为要调用的函数范围的作用域param传递(函数内部的“this”的值)。

答案 3 :(得分:0)

为什么需要基于(基于对象的)函数式语言的类? 你的意图有点不清楚。您的测试函数中参数'method'的隐含类型是什么? 我假设它是一个方法名称。无论如何,下面的代码可能有所帮助。

/* prefer this class pattern */
var Car = (function () {
    "use strict";
    Car.prototype = {
        name : undefined ,
        run: function () {
            return name_ + "::  run";
        },
        stop: function () {
            return name_ + "::  stop";
        }
    };
    /* constructor */
    function Car(name) {
        name_ = name;
    }
    return Car;
})();
function printer(msg_) {
   document.body.innerHTML += msg_ + "<br/>";
}
function test(car_, method_name_1, method_name_2) {
       printer(car_[method_name_1]());
       printer(car_[method_name_2]());
}
test( new Car("BMW"), "run", "stop");
test( new Car("Lada"), "run", "stop")

答案 4 :(得分:-1)

此外,您还可以使用eval功能:

var instance = new Car();
eval('instance.'+method+'();');
虽然菲利斯·波拉诺的方式远非整齐。

http://jsfiddle.net/VZdXb/