2015-10-02 94 views
0

我有一個很難理解這是如何保持的功能基本上進行了擴展。擴展的Javascript原型方法

我看到(function(){})會立即調用一個聲明的函數。我不明白提供open作爲參數。最後,我不明白(XMLHttpRequest.prototype.open)是怎麼回事。這是調用原型函數嗎?

(function(open) { 
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) { 
    open.call(this, arguments); 
    }; 
})(XMLHttpRequest.prototype.open); 

回答

2

function (open) { .. }聲明瞭一個帶有一個參數的函數。
(..)(XMLHttpRequest.prototype.open)正在調用此函數並且正在傳遞XMLHttpRequest.prototypeopen函數作爲參數。是的,它通過的實際功能本身;函數可以像值一樣傳遞。

那麼,在那個IIFE裏面(立即調用函數表達式),open就是XMLHttpRequest.prototype.open的原始實現。

然後,在IIFE內部,XMLHttpRequest.prototype.open被替換爲新的功能。在這個新功能中,原來的open函數被調用。這本身並不太令人興奮,但它顯示瞭如何在被調用的XMLHttpRequest.prototype.open與正在執行的實際原始open函數之間插入自己的代碼。

與IIFE的整個考驗只是爲了保留原始open函數的句柄,在任何情況下都不能被其他代碼覆蓋,因爲它是函數的本地函數。

+0

謝謝。我只是仍然堅持'(函數(參數){})(myParam)'。如何將'myParam'傳遞給函數? '(function())()'這叫什麼名字? – BarryBones41

+0

它被稱爲* IIFE *。 – deceze

+1

如果這樣做更容易,將其重寫爲'function foo(open){..};富(XMLHttpRequest的...);'。一樣。 – deceze

0

這是這個確切的複製品。

//Create a XMLHttpRequest.realOpen function and store the original XMLHttpRequest.open function in it 
XMLHttpRequest.prototype.realOpen = XMLHttpRequest.prototype.open; 

//Change the XMLHttpRequest.open function 
XMLHttpRequest.prototype.open = function(method, url, async, user, password) { 

    //Do Your Code Here.... 

    //Call original XMLHttpRequest.open function which is now saved in XMLHttpRequest.realOpen function 
    this.realOpen(method, url, async, user, password); 
};