2017-09-15 10 views
10

Próbuję rozszerzyć bibliotekę stron trzecich na określonej stronie, ale nie chcę zmieniać żadnego kodu strony trzeciej. Znam nazwy funkcji, które biblioteka stron trzecich wywołuje, gdy coś się dzieje, więc jeśli chcę, aby mój własny niestandardowy kod był wykonywany po tym, jak mogę to zrobić?JS: Wywołanie funkcji po drugiej bez dotykania oryginalnej funkcji?

Third Party Biblioteka posiada:

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

Teraz, jeśli to był mój własny kod zrobiłbym coś takiego:

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

Jednak to nie jest i nie chcę, aby zastąpić kod biblioteki giełdowej. Czy jest tak, aby zrobić powyższe, ale bez dotykania oryginalnego kodu funkcji? Miałbym odniesienie do samej funkcji, ale to wszystko.

EDYCJA: Należy wspomnieć, że zadeklarowana funkcja jest dostępna globalnie.

+0

Funkcja biblioteki dzwoni musi prawdopodobnie istnieje w sytuacji, gdy nie jest to możliwe, aby go zastąpić. E.g: jeśli zostało zadeklarowane w zamknięciu, nie można go zastąpić. Jedynym sposobem, w jaki to działa, jest to, czy biblioteka osób trzecich używa funkcji zdefiniowanej w zasięgu globalnym, co nie jest ogólnie zalecane. – nicooga

Odpowiedz

19

Jeżeli istnieje sposób, aby uzyskać referencję do funkcji, którą chcesz rozszerzyć można „monkey-plaster” to tak:

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

    // your code here 
}; 

To skutecznie ponownie pisze funkcję, którą chcesz rozciągać się w nieco płynny sposób.

More information about monkey-patching.

7

„Staram się rozszerzyć bibliotekę strony trzeciej na konkretnej stronie, ale nie chcę, aby zmienić dowolne trzeciego kodeksu Party”

To nie może być zrobione. Musisz jakoś zmienić kod, aby zareagować na to, chyba że kod dostarcza mechanizm emitujący zdarzenia lub coś podobnego.

Sposób podejścia do tej czynności bez wpływu na bibliotekę polega na zastąpieniu funkcji, którą chcesz rozszerzyć, dzięki temu, że zrobi wszystko, co już zrobiła i dodaniu niestandardowego zachowania na wierzchu.

Na przykład:

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

Powiązane problemy