2017-01-24 26 views
1

我有一段代碼,我需要通過其名稱覆蓋函數。 它簡化版本在這裏:是否有可能通過從代碼中的谷歌關閉獲得編譯的函數名稱?

function override(obj, funcName){ 
    if(obj && obj[funcName]) 
     obj[funcName] = function(){ alert("Haha, now it's different func!"); } 
    else 
     console.error("Object does not contain function "+funcName); 
} 

它完美的,除非我與谷歌關閉編譯它,然後,當然,這不,因爲功能obj.doSomethingBeneficial變得像水木清華... obj.qq

所以問題是:是否有可能從代碼中知道該函數的編譯名稱是什麼?然後我可以正確覆蓋它。

回答

1

編譯器會識別一個特殊的函數名稱,該名稱允許您以與重命名屬性相同的方式重命名字符串:goog.reflect.objectProperty(prop name, obj)。該函數是閉包庫的一部分,但您可以自己定義它,而無需包含閉包庫。

var goog = { reflect: { objectProperty: function(name, obj) { return name; } } }; 
if (obj && obj['funcName']) { 
    obj[goog.reflect.objectProperty('funcName', obj)] = 
     function(){ alert("Haha, now it's different func!"); }; 
} else { 
    console.error("Object does not contain function "+ 'funcName'); 
} 

一個需要注意的是,到goog.reflect.objectProperty第一個參數必須是字符串文字。你不能使用一個變量。

+0

謝謝,但我如何使用它在我的情況下,你能舉個例子嗎?我只是不明白我怎麼能說清楚編譯器,我想這個特定的對象,我工作的縮短名稱... – shal

+0

@shal增加了一個例子 –

相關問題