2009-12-22 25 views
3

屬性有沒有辦法來調用通過反射的對象上的函數(或屬性),在JavaScript?的JavaScript:調用功能或致電通過反射

比方說,它在運行時,我的代碼已經確定objectFoo確實有一個名爲「酒吧」屬性。現在我的代碼知道了,接下來我想要做的就是調用它。通常我會這樣做:var x = objectFoo.bar。但'bar'是在運行時確定的,所以我需要使用反射來調用它。

回答

3

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

評估和演示將允許你通過傳遞一個字符串,並具有JavaScript引擎評估它的JavaScript代碼運行任何JavaScript代碼。

如果你的意思是你要首先搜索對象的列表屬性,然後看看這個:

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

如果你這樣做,你甚至可以通過訪問它,就好像設置該屬性的值就是一個數組(所有對象實際上都是關聯數組)。

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

OMG當然... EVAL。我是個白癡。謝謝你,我應該想到這一點。 – 7wp 2009-12-22 19:12:57

+15

的eval()比你需要做你想做的一個更大的棒。只需使用關聯數組語法:'var propName ='bar'; VAR X = objectFoo [PROPNAME];' – Annabelle 2009-12-22 19:17:31

+1

相關的說明,如果包含該函數的變量的範圍是 「窗口」,則可以使用父[變種](); – sparkey0 2009-12-22 19:25:14

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](); 
+2

我的答案有這個...它有這個和評估。 – 2009-12-22 20:27:02

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(); 
}; 
+0

愛的概念..一個混亂。如何獲得函數的輸出? – Shashi 2016-12-12 08:25:02

+0

使用F12激活瀏覽器控制檯,然後在菜單中選擇「控制檯」。 – 2016-12-12 12:13:36

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);