2017-09-15 14 views
10

特定のページでサードパーティライブラリを拡張しようとしていますが、サードパーティのコードを変更したくありません。第三者図書館が何か起こったときに呼び出す関数の名前を知っています。それで私の独自のカスタムコードを実行するにはどうしたらいいですか?JS:元の機能に触れずに別の機能を呼び出す

サードパーティライブラリがあります。

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

を今、それは私自身のコードだった場合、私はこのような何かをしたい:

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

しかし、それはないと私は上書きしたくありませんストックライブラリコード。だから、とにかく上記を行うには、元の関数コードに触れることなくですか?私は関数そのものを参照していますが、それだけです。

EDIT:宣言された関数がグローバルに利用可能であることを言及する必要があります。

+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();

関連する問題