2

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

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() 方法呢?

4

5 回答 5

2

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

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

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

看到它在 JsFiddle 上工作

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

于 2012-10-03T10:16:39.943 回答
1

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

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

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

如何在 Object 中使用 apply() 方法

这取决于您想要达到的目标。MDN 上有文档。

于 2012-10-03T10:13:20.113 回答
1

也许你想打电话

实例.方法()

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

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

或者

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

其中实例作为范围参数传递,这是要调用的函数的范围(函数内部“this”的值)。

于 2012-10-03T10:17:38.677 回答
0

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

/* 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")
于 2012-10-03T11:32:44.990 回答
-2

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

var instance = new Car();
eval('instance.'+method+'();');

虽然 Felice Pollano 的方式在 imo 中要简洁得多。

http://jsfiddle.net/VZdXb/

于 2012-10-03T10:32:39.627 回答