2017-09-15 46 views
10

我想在特定頁面上擴展第三方庫,但我不想更改任何第三方代碼。我知道第三方庫在發生某些事情時調用的函數的名稱,因此如果我想在此之後執行自己的自定義代碼,那我該怎麼做?JS:在不觸及原始函數的情況下調用一個函數?

第三方庫有:

function eventFinished(args){ 
    //library stuff here 
} 

現在,如果這是我自己的代碼,我會做這樣的事情:

function eventFinished(args){ 
    //library stuff here 
    MyCustomFunction(); 
} 

但是,它不是,我不希望覆蓋股票庫代碼。那麼無論如何要做到這一點,但沒有觸及原始功能代碼?我會參考這個函數本身,但就是這樣。

編輯:我應該提到宣佈的功能是全球可用的。

+0

庫呼籲必須存在有可能在上下文地方是不可能覆蓋它的功能。例如:如果它是在封閉內部聲明的,則不可能覆蓋它。唯一的辦法是如果第三方庫使用全局範圍中定義的函數(通常不推薦)。 – nicooga

回答

19

如果你得到你想要延長你可以在「猴子補丁」像這樣的函數的引用方式:

var fnOriginalFunction = functionYouWantToExtend; 
functionYouWantToExtend = function() { 
    fnOriginalFunction.apply(this, arguments); 

    // your code here 
}; 

這有效地重新寫你想要的功能以有點無縫的方式延伸。

More information about monkey-patching

7

「我試圖在特定頁面上擴展第三方庫,但我不想改變任何的第三方代碼」

這不能做。除非代碼提供事件發送機制或類似的東西,否則必須以某種方式更改代碼以對其作出反應。

在不影響庫的情況下處理此問題的方法是,通過讓它完成已做的所有操作並在上面添加自定義行爲來覆蓋要擴展的函數。

例如:

const Library = { 
 
    method() { 
 
    console.log('I am the library method'); 
 
    } 
 
} 
 

 
const unalteredMethod = Library.method; 
 
Library.method = function() { 
 
    unalteredMethod.apply(this, arguments); 
 
    console.log('my custom behavior'); 
 
} 
 

 
Library.method();

相關問題