有没有办法通过反射在JavaScript中调用对象上的函数(或属性)?
让我们说在运行期间,我的代码已经确定objectFoo确实有一个名为'bar'的属性。现在我的代码知道了,接下来要做的就是调用它。通常我会这样做:var x = objectFoo.bar。但是'bar'是在运行时确定的,所以我需要使用反射来调用它。
答案 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);