我有方法a(),方法b()方法c()..我将从服务器获取响应消息,其中包含a或b或c等。 如果回复消息是 a ,那么我需要调用方法 a()。如果响应消息是 b ,那么我需要调用方法 b() .... 我不想写任何if else条件或切换案例来识别方法。
我不想这样做。
if(res =='a')
a();
else if(res =='b')
b();
而不是我需要像java中的反射一样。
答案 0 :(得分:7)
如果您已在Global / window Scope中定义了该功能,则可以直接使用res
变量
window[res]();
否则在object中定义函数然后使用它
var obj = {
a : function(){},
b : function(){}
}
obj[res]();
答案 1 :(得分:6)
你可以使用一个对象并将函数存储在里面,比如
var functions = {
a: function () {},
b: function () {},
c: function () {}
default: function () {} // fall back
}
用法:
functions[res]();
或默认
(functions[res] || functions.default)();
答案 2 :(得分:1)
为此,您可以定义一个类,允许您定义和调用方法,并确定调用上下文:
var MethodsWorker = function () {
this._context = window;
this._methods = {};
}
MethodsWorker.prototype.setContext = function (context) {
this._context = context;
}
MethodsWorker.prototype.defineMethod = function (name, method) {
this._methods[name] = method;
};
MethodsWorker.prototype.invoke = function (methodName, args) {
var method = this._methods[methodName];
if (!method) { throw {}; }
return method.apply(this._context, args);
};
用法:
var methodsWorker = new MethodsWorker ();
methodsWorker.setContext(Math);
methodsWorker.defineMethod('sqrtOfSum', function() {
var sum = 0;
for (var i = 0, n = arguments.length; i < n; i++) {
sum += arguments[i];
}
return this.sqrt(sum);
});
var result = methodsWorker.invoke('sqrtOfSum', [1, 2, 3]);
alert (result);