2

次のような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インスタンスを適切に指します。これは、あなたが望むものだと思います。applyまたはを使用callすると、通常、デフォルトの''値を別の値に変更する必要がある場合に使用されthisます。

于 2012-10-03T10:16:39.943 に答える
1

たぶんあなたは電話したい

instance.method()

動的に呼び出します。つまり、実行/停止に渡された値に基づいて呼び出します。あなたはこれを試すことができます-

instance [method] .call(instance)

また

instance [method] .apply(instance)

ここで、インスタンスは、呼び出される関数のスコープであるスコープparamとして渡されます(関数内の「this」の値)。

于 2012-10-03T10:17:38.677 に答える
1

apply()メソッドを使用する必要があることはわかっています。

あなたはそうしない。instance.run()コードのコメントを解除し、test()メソッドを呼び出すと、機能します。

デモ: http: //jsfiddle.net/JkAnb/

オブジェクトでapply()メソッドを使用するにはどうすればよいですか

それはあなたが何を達成したいかによります。MDNにドキュメントがあります。

于 2012-10-03T10:13:20.113 に答える
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+'();');

フェリーチェポラーノのやり方ははるかにきれいなイモですが。

http://jsfiddle.net/VZdXb/

于 2012-10-03T10:32:39.627 に答える