JavaScript 中的方法指针/引用

method pointer/ref in javascript

本文关键字:引用 指针 方法 JavaScript      更新时间:2023-09-26

这是我当前代码的示例:

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

是的,函数是 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 (在规范中 | 在 MDN 上)
  • Function#apply(在规范中 | 在 MDN 上)
  • 你必须记住this (在我的博客上)
  • 神话方法(在我的博客上)

你在变量中使用函数引用,如下所示:-

var method;
if(something)
    var method = myObject.method1;
else
    var method = myObject.method2;
method.call(myObject, arg1, arg2);

你可以做:

var method = myObject.method1;

然后这样称呼它:

method.call(myObject);

但您也可以bind对象的方法:

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

然后你可以正常调用它:

method();

里面thismyObject

您可以将bind替换为简单:

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

如果要支持较旧的浏览器