以下是我当前代码的示例:
var myObject = new Obj();
if(something)
myObject.method1(arg1, arg2);
else
myObject.method2(arg1, arg2);
以及我如何宣布我的对象:
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);
答案 0 :(得分:2)
是的,函数是JavaScript中的第一类对象,因此您可以将函数引用存储在变量中,然后通过变量调用函数。在您的情况下,您需要以特殊方式执行此操作,以确保呼叫中this
为myObject
:
var method;
if(something)
method = myObject.method1;
else
method = myObject.method2;
method.call(myObject, arg1, arg2);
注意最后使用call
:这允许你调用一个函数并控制函数调用中的this
。
如果条件真的很短,你可以这样做:
var method = something ? myObject.method1 : myObject.method2;
method.call(myObject, arg1, arg2);
甚至:
var method = something ? "method1" : "method2";
myObject[method](arg1, arg2);
更多探索:
Function#call
(in the spec | on MDN)Function#apply
(in the spec | on MDN)this
(在我的博客上) 答案 1 :(得分:1)
在这样的变量中使用函数引用: -
var method;
if(something)
var method = myObject.method1;
else
var method = myObject.method2;
method.call(myObject, arg1, arg2);
答案 2 :(得分:0)
你可以这样做:
var method = myObject.method1;
然后称之为:
method.call(myObject);
但您也可以bind
对象的方法:
var method = myObject.method1.bind(myObject);
然后你可以正常调用它:
method();
内部的和this
将为myObject
您可以使用简单的替换bind
:
var method = function() { myObject.method1(); }
如果您想支持旧浏览器