2017-01-24 34 views
2

我有方法a(),方法b()方法c()..我將從服務器獲取響應消息,其中包含a或b或c等。 如果響應消息是a,那麼我需要調用方法a()。 Tf響應消息是b,那麼我需要調用方法b() .... 我不想寫任何其他條件或開關情況來確定方法。如何調用基於變量值的javascript方法

我不想這樣做。

if(res =='a') 
    a(); 
else if(res =='b') 
    b(); 

取而代之的是我需要類似java中的反射。

回答

7

如果您已經在全球/窗範圍內定義的函數,那麼你可以直接使用res變量

window[res](); 

否則在對象定義的函數,然後用它

var obj = { 
    a : function(){}, 
    b : function(){} 
} 
obj[res](); 
+1

非常感謝。工作正常。 – Prasath

6

你可以使用一個對象和存儲功能,如

var functions = { 
    a: function() {}, 
    b: function() {}, 
    c: function() {} 
    default: function() {} // fall back 
} 

美國GE:

functions[res](); 

或者默認

(functions[res] || functions.default)(); 
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);