JavaScript:通过反射调用函数或调用属性

时间:2009-12-22 19:09:47

标签: javascript reflection

有没有办法通过反射在JavaScript中调用对象上的函数(或属性)?

让我们说在运行期间,我的代码已经确定objectFoo确实有一个名为'bar'的属性。现在我的代码知道了,接下来要做的就是调用它。通常我会这样做:var x = objectFoo.bar。但是'bar'是在运行时确定的,所以我需要使用反射来调用它。

4 个答案:

答案 0 :(得分:6)

在JavaScript中,对象方法实际上只是包含函数的属性。与所有属性一样,您可以使用关联数组语法来引用它们:

var x = { 'a': 1 };
x.a += 1;
x['a'] += 1;
console.log(x.a);

输出为:3

因此,如果您要在myObject上调用方法的名称:

var methodName = 'myMethod';

// Invoke the value of the 'myMethod' property of myObject as a function.
myObject[methodName]();

答案 1 :(得分:4)

EVAL: http://www.w3schools.com/jsref/jsref_eval.asp

Eval允许您通过传入字符串并让javascript引擎将其评估为javascript代码来运行任何javascript代码。

如果您想首先搜索对象的列表属性,请查看以下内容:

var o = {}
for(att in o){
    alert(o[att]);
}

如果这样做,您甚至可以通过访问它来设置属性的值,就像它是一个数组一样(所有对象实际上都是关联数组)。

obj["propertyName"] = "new value";
obj["MethodName"]();

答案 2 :(得分:4)

通过反射创建对象(调用构造函数):

SomeClass = function(arg1, arg2) {
    console.log('Your reflection');
}

ReflectUtil.newInstance('SomeClass', 5, 7);

和实施:

var ReflectUtil = {};

/**
 * @param strClass:
 *          class name
 * @param optionals:
 *          constructor arguments
 */
ReflectUtil.newInstance = function(strClass) {
    var args = Array.prototype.slice.call(arguments, 1);
    var clsClass = eval(strClass);
    function F() {
        return clsClass.apply(this, args);
    }
    F.prototype = clsClass.prototype;
    return new F();
};

答案 3 :(得分:0)

创建一个寄存器对象:

var funcRegister = {};

创建一个函数来调用另一个:

var callReflectionFunc = function(type, obj) {
    var func = false;
    if(funcRegister[type])
        func = funcRegister[type](obj);

    return func;
}

使用函数填充寄存器:

funcRegister['yourtype1'] = function(obj) {
    console.log('your type 2');

    return obj;
}

funcRegister['yourtype2'] = function(obj) {
    console.log('your type 2');

    return obj;
}

然后用你的类型和一个你可以放置你的args的对象来调用它

callReflectionFunc(type, obj);