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 中的一等对象,因此您可以将函数引用存储在变量中,然后通过变量调用函数。在您的情况下,您需要以特殊方式执行此操作,以确保thismyObject通话中:

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);

更多探索:

于 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 回答