Próbuję dostosować istniejącą bibliotekę JS bez modyfikowania oryginalnego kodu JS. Ten kod ładuje się w kilku zewnętrznych plikach JS, do których mam dostęp, a chciałbym zmienić jedną z funkcji zawartych w oryginalnym pliku bez kopiowania i wklejania całości do drugiego pliku JS.
Na przykład, JS poza granicami może mieć taką funkcję:
var someFunction = function(){
alert("done");
}
Chciałbym móc jakoś dołączyć lub wstawić jakiś kod JS do tej funkcji. Powodem jest przede wszystkim to, że w oryginalnym niedotykalnym JS funkcja jest dość ogromna i jeśli ten JS kiedykolwiek zostanie zaktualizowany, funkcja, którą go nadpiszę, będzie nieaktualna.
Nie jestem do końca pewien, czy jest to możliwe, ale pomyślałem, że sprawdzę.
javascript
merge
append
user-defined-functions
prepend
Munzilla
źródło
źródło
Odpowiedzi:
Jeśli
someFunction
jest dostępny globalnie, możesz buforować tę funkcję, utworzyć własną i zlecić jej wywołanie.Więc jeśli to jest oryginał ...
Zrobiłbyś to ...
Oto skrzypce
Zauważ, że używam
.apply
do wywoływania funkcji buforowanej. Pozwala mi to zachować oczekiwaną wartośćthis
i przekazać wszystkie argumenty przekazane jako indywidualne argumenty, niezależnie od tego, ile ich było.źródło
apply
: to jedyna odpowiedź, która naprawdę rozwiązuje problem.funciton
słowa kluczowego JavaScript ? ;) Dzięki za edycję.apply()
. Ale jeśli byłby to obiekt podobny do tablicy, na przykład obiekt jQuery, to tak, niektóre przeglądarkinajpierw zapisz rzeczywistą funkcję w zmiennej.
następnie zdefiniuj własne:
źródło
apply
aby ją wywołać. Zobacz odpowiedź.someFunction
zewindow.someFunction
w powyższym kodzie. Powodem jest to, że moja funkcja została zadeklarowana w module$(document).ready()
obsługi jquery .Możesz utworzyć funkcję, która wywołuje Twój kod, a następnie wywołuje funkcję.
źródło
Nie wiem, czy możesz zaktualizować funkcję, ale w zależności od tego, jak się do niej odwołuje, możesz w jej miejsce utworzyć nową funkcję:
źródło
Również. Jeśli chcesz zmienić lokalny kontekst, musisz odtworzyć funkcję. Na przykład:
Teraz
Następnie
I
Ale to tylko najprostszy przykład. Nadal będzie wymagało dużo pracy, aby obsłużyć argumenty, komentarze i zwracaną wartość. Ponadto nadal istnieje wiele pułapek.
toString | plasterek | indexOf | lastIndexOf | nowa funkcja
źródło
Wzorzec proxy (używany przez user1106925) można umieścić wewnątrz funkcji. Ten, który napisałem poniżej, działa na funkcjach spoza zakresu globalnego, a nawet na prototypach. Używałbyś tego w ten sposób:
W poniższym fragmencie możesz zobaczyć, jak używam funkcji rozszerzającej test.prototype.doIt ().
źródło