2012-11-05 108 views
3

我有一個問題,我想在JavaScript中創建一個'鉤子',所以我創建了一個小功能來做到這一點。Javascript的Eval代碼問題

這裏是我的代碼:

GoogleMaps.prototype.callUserFunc = function(func, args){ 
    eval('GoogleMaps.' + func + '.apply(func, args)'); 
} 

我已經是我真的不想使用eval()函數的問題,是有這樣做沒有更好的辦法?

我對這個不太好的問題表示歉意,我的javascript在窮人方面有點不足。

謝謝!

+1

是'GoogleMaps'對象的'func' ,還是在'.prototype'對象上? –

回答

4

您可以使用方括號表示法訪問對象的屬性。

例如:

var x = { 
    someProperty: 5 
}; 

console.log(x["someProperty"]); // => 5 
console.log(x.someProperty); // => 5 

var y = 'someProperty'; 
console.log(x[y]); // => 5 

x["someProperty"]相同x.someProperty

你可以這樣使用它。

GoogleMaps.prototype.callUserFunc = function(func, args){ 
    GoogleMaps[func].apply(func, args); 
} 
+0

真棒謝謝你們! – DarkMantis

+1

在'apply'中使用'func'是沒有意義的。 – zzzzBov

+1

我同意,它應該可能是'this'。我首先將它改爲'this',但後來又改回它以保持其功能等同於他的原始代碼。儘管'func.apply(func,...'沒有多大意義,但他現有的代碼可能依賴於這種行爲,這是一個不同的討論。 –

3
GoogleMaps.prototype.callUserFunc = function(func, args){ 
    GoogleMaps[func].apply(func, args); 
    //eval('GoogleMaps.' + func + '.apply(func, args)'); 
} 
1

一個真正的直通功能將返回由該函數返回的值,並會在GoogleMaps的上下文中調用。

您的主要問題是不知道該數組訪問符號可以在任何物體上使用:

GoogleMaps.prototype.callUserFunc = function(func, args) { 
    return GoogleMaps[func].apply(GoogleMaps, args); 
}; 

在一般情況下,雖然,你可能會更好編寫代碼:

GoogleMaps[func](...args...); 

但是,這一切都假設GoogleMaps包含靜態可訪問的函數,並沒有被用作實例化對象的構造函數。

不知道如何GoogleMaps正在被使用,它可能是您的直通功能應關閉的對象實例執行該callUserFunc正在呼籲:

GoogleMaps.prototype.callUserFunc = function(func, args) { 
    return this[func].apply(this, args); 
}; 
+1

+1這看起來似乎更合理'thisArg'傳遞給'.apply'。 –