2

これが私の現在のコードの例です:

var myObject = new Obj();

if(something)
    myObject.method1(arg1, arg2);
else
    myObject.method2(arg1, arg2);

そして、どのように obj を宣言したか:

function Obj() { }

Obj.prototype.method1 = function(a, b) { }
Obj.prototype.method2 = function(a, b) { }

私はこの種のテストを何度も行っているので、そのようなことが可能かどうか疑問に思っていました:

if(something)
    var method = method1;
else
    var method = method2;

myObject.method(arg1, arg2);
4

3 に答える 3

2

はい、関数は JavaScript のファースト クラス オブジェクトであるため、関数参照を変数に格納し、変数を介して関数を呼び出すことができます。あなたの場合、それが呼び出し内にあることを確認するために特別な方法でそれを行う必要がありthisますmyObject:

var method;
if(something)
    method = myObject.method1;
else
    method = myObject.method2;

method.call(myObject, arg1, arg2);

call最後に there を使用していることに注意してください。これにより、関数を呼び出しthisて、関数呼び出し内にあるものを制御できます。

条件が本当に短い場合は、次のようにすることができます。

var method = something ? myObject.method1 : myObject.method2;
method.call(myObject, arg1, arg2);

あるいは:

var method = something ? "method1" : "method2";
myObject[method](arg1, arg2);

さらに探索する:

于 2013-10-26T16:27:10.160 に答える
1

次のような変数で関数参照を使用します。

var method;
if(something)
    var method = myObject.method1;
else
    var method = myObject.method2;

method.call(myObject, arg1, arg2);
于 2013-10-26T16:27:30.387 に答える
0

あなたはただ行うことができます:

var method = myObject.method1;

次に、次のように呼び出します。

method.call(myObject);

bindただし、オブジェクトにメソッドを作成することもできます:

var method = myObject.method1.bind(myObject);

その後、通常どおり呼び出すことができます:

method();

そしてthis内側はmyObject

bindシンプルに置き換えることができます:

var method = function() { myObject.method1(); }

古いブラウザをサポートしたい場合

于 2013-10-26T16:56:59.797 に答える