获取对象引用和函数名称

时间:2016-03-20 13:48:19

标签: javascript function object

如何从objectReference [" functionName"]形式的输入中检索包含函数的对象的引用。

示例:

function aaa(param) {
    var objectReference = /*..???...*/;
    var functionName = /*...???..*/;

    // Now expected result is that objectReference contains
    // a reference to myObject, and functionName contains a
    // string with name of function (implemented in myObject),
    // so I can invoke it with objectReference[functionName]()
    // after some manipulation.
}

var myObject = new SomeFunction();

aaa(myObject["myFunction"]);

谢谢

1 个答案:

答案 0 :(得分:4)

你不能做你列出的任何事情。这里有两个不同的东西:

  1. 获取myObject

  2. 获取该对象用于引用函数的属性的名称

  3. 代码中传递给aaa的值只是对函数的引用。对象的引用不会传递到aaa,也不会传递有关该对象用于引用该函数的属性的任何信息。既不能推断也不能从函数引用本身派生出来。 (该函数可能有一个名称,它可以在现代JavaScript引擎上通过其name属性进行访问,但这可能与该对象用于引用的属性的名称不同它。)

    为了做到这一点,你必须单独传递它们,或者作为离散参数:

    aaa(myObject, "myFunction");
    

    或作为对象

    aaa({obj: myObject, prop: "myFunction"});
    

    在后一种情况下,aaa可能看起来像

    function aaa(info) {
        // Use info.obj and info.prop here
        // The call would be
        info.obj[info.prop]();
    }
    

    另一个选项是,如果除了打电话之外你真的不需要对象引用,那就是使用Function#bind

    aaa(myObject["myFunction"].bind(myObject));
    

    aaa会收到一个函数引用,当被调用时,将使用引用this的{​​{1}}来调用原始函数。所以myObject实际上无法获得对象引用,但它仍然可以进行调用。