2013-11-26 86 views
0

我想重寫一個Javascript函數,包含在.js文件,我不能修改(它是從服務器我們的應用程序沒有部署)。該函數包含其中的函數和變量。有一個子函數需要改變行爲,但是被另一個調用,我不能直接調用它。那就是:遇到問題擴展Javascript函數與更多的功能

包含的文件過於簡單的版本,我不能改變:

com.company.topLevelFunc = function() { 
    var a = null; 
    var b = null; 
    var doSomething = function() { 
    a = foo; 
    b = bar; 
    }; 
    var get = function(cfg) { 
    //do stuff 
    }; 
    return { 
    //other vars and functions here 
    getValue : function (cfg) { 
     cfg.url=a + b; 
     get(cfg); 
    } 
    }; 
}(); 

我需要重寫的功能是GET(CFG)。但是,我不能直接調用它,我需要通過getValue(cfg)方法並保留頂層函數中所有其他內容。所以我一直在試圖覆蓋兩個如下:

我的JS,我完全控制,並沒有工作,它的錯誤申請說'缺少:屬性ID後「。我這樣做是正確的,不知道如何從一些非常聰明的適用於正常工作?

var topLevel = com.company.topLevelFunc; 
myTopLevel = function() { 
    var myGet = function(cfg) { 
    //do simliar but different stuff from the original get function 
    }; 
    return { 
    topLevel.apply(this, arguments); 
    getMyValue : function (cfg) { 
     cfg.c= a + b +"some other string"; 
     //do something 
     myGet(cfg); 
    } 
    }; 
}(); 
+1

'我在做這件事嗎?'你有沒有試圖檢查你的結果,以發現一些明顯的語法錯誤,比如第一個例子中的extra()和第二個中的apply調用? – Tibos

+0

我在第一個例子中刪除了(),這是一個輸入到這個論壇的錯字,謝謝。我沒有得到任何其他語法錯誤,只是在應用調用中出現「丟失:在屬性列表之後」的錯誤。我不知道爲什麼,也許我不明白申請是如何運作的,並且沒有正確地使用它或在正確的地方使用它。我的意圖是讓原來的頂級功能進入相同的狀態,就像我調用getValue而不是getMyValue一樣。 – user3034229

回答

0

不幸的是你,get方法是私有的,它只能存在一個匿名函數沒有人的身體內部訪問。除了黑客和未經推薦的編程,你無法做任何改變

你應該在這種情況下做什麼是改變getValue財產com.company.topLevelFunc。你試圖做的方式有點不對,我會解釋爲什麼。

a = function() { // this is not a 
    var c = function() { return 3; }; 
    return { // this object is a 
    b : c; 
    } 
}(); // called immediately 

在這個構造中,a不是函數。您在那裏看到的函數立即被調用,並且a被分配了該調用的返回值。實際上這幾乎是等價的:

a = { b : function() { return 3; } }; 

爲什麼你會用第一個構造而不是第二個是這裏問了很多次的問題。簡短的回答是,第一個答案允許您擁有其他人無法訪問的私人內容(如您的get方法)。

所以一個是誰的價值屬性的對象是,如果你想有一個返回4返回3.一個功能,你需要做這樣的事情:

a.b = function() { return 4; } 

這使的其他屬性a原封不動(如果有的話),只會改變你感興趣的屬性。

如果你想讓b訪問上面匿名函數中定義的一些私有屬性,它就不能完成。