Mam funkcję, a()
którą chcę przesłonić, ale też mam a()
wykonać oryginał w kolejności zależnej od kontekstu. Na przykład czasami podczas generowania strony chcę zastąpić ją w następujący sposób:
function a() {
new_code();
original_a();
}
a czasami tak:
function a() {
original_a();
other_new_code();
}
Jak mogę to osiągnąć original_a()
z over-ringu a()
? Czy to w ogóle możliwe?
Proszę nie sugerować alternatyw dla over-riding w ten sposób, znam wiele. Pytam konkretnie o ten sposób.
(functi..
i})
. Samo zrobienie tego}();
dałoby ten sam wynik, ponieważ(function{})()
pierwszy zestaw nawiasów jest używany, ponieważ nie możesz po prostu zadeklarować anonimowego wyrażenia funkcyjnego, które musisz przypisać. Ale wykonując () nie definiujesz niczego po prostu zwracając funkcję.a
, nie wywołując jej i nie przechowując wartości zwracanej. Nawiasy informują, że dzieje się coś jeszcze.Wzorzec Proxy może pomóc:
źródło
Dzięki chłopaki wzorzec proxy naprawdę pomógł ..... Właściwie to chciałem wywołać funkcję globalną foo .. Na niektórych stronach muszę zrobić kilka kontroli. Więc zrobiłem co następuje.
Dzięki temu naprawdę mi pomogło
źródło
org_foo(args)
wywołaćorg_foo.call(this, args)
. To zachowuje sięthis
tak, jak by było, gdyby window.foo wywoływało normalnie (bez pośrednictwa proxy). Zobacz tę odpowiedźMożesz przesłonić funkcję używając konstrukcji takiej jak:
Na przykład:
Edycja: Poprawiono literówkę.
źródło
Przekazywanie dowolnych argumentów:
źródło
original_a
chociaż?Odpowiedzią, którą zapewnia @Matthew Crumley, jest użycie natychmiast wywołanych wyrażeń funkcyjnych, aby zamknąć starszą funkcję „a” w kontekście wykonania funkcji zwróconej. Myślę, że to była najlepsza odpowiedź, ale osobiście wolałbym przekazać funkcję „a” jako argument do IIFE. Myślę, że jest to bardziej zrozumiałe.
źródło
Powyższe przykłady nie są poprawnie stosowane
this
lub przekazywanearguments
do przesłonięcia funkcji. Podkreślenie _.wrap () zawija istniejące funkcje, stosujethis
i przekazujearguments
poprawnie. Zobacz: http://underscorejs.org/#wrapźródło
Miałem kod napisany przez kogoś innego i chciałem dodać wiersz do funkcji, której nie mogłem znaleźć w kodzie. Więc jako obejście chciałem to zastąpić.
Żadne z rozwiązań nie zadziałało jednak dla mnie.
Oto, co zadziałało w moim przypadku:
źródło
Stworzyłem małego pomocnika dla podobnego scenariusza, ponieważ często musiałem nadpisywać funkcje z kilku bibliotek. Ten pomocnik akceptuje „przestrzeń nazw” (kontener funkcji), nazwę funkcji i funkcję nadpisującą. Zastąpi oryginalną funkcję w przywołanej przestrzeni nazw nową.
Nowa funkcja przyjmuje oryginalną funkcję jako pierwszy argument, a oryginalne argumenty funkcji jako resztę. Za każdym razem zachowa kontekst. Obsługuje również funkcje void i non-void.
Użycie na przykład z Bootstrap:
Nie stworzyłem jednak żadnych testów wydajności. Może to prawdopodobnie dodać niechciane obciążenie, które może lub nie może być wielką sprawą, w zależności od scenariuszy.
źródło
Moim zdaniem pierwsze odpowiedzi nie są czytelne / możliwe do utrzymania, a pozostałe odpowiedzi nie wiążą odpowiednio kontekstu. Oto czytelne rozwiązanie wykorzystujące składnię ES6 do rozwiązania obu tych problemów.
źródło
Tak więc moja odpowiedź okazała się rozwiązaniem, które pozwala mi użyć _tej zmiennej wskazującej na oryginalny obiekt. Tworzę nową instancję „Square”, jednak nienawidzę sposobu, w jaki „Square” generuje swój rozmiar. Pomyślałem, że powinien odpowiadać moim konkretnym potrzebom. Jednak w tym celu potrzebowałem kwadratu, aby miał zaktualizowaną funkcję "GetSize" z wewnętrznymi elementami tej funkcji wywołującymi inne funkcje już istniejące w kwadracie, takie jak this.height, this.GetVolume (). Ale żeby to zrobić, musiałem to zrobić bez żadnych zwariowanych hacków. Oto moje rozwiązanie.
Inny inicjator Object lub funkcja pomocnicza.
Funkcja w innym obiekcie.
źródło
Nie jestem pewien, czy zadziała we wszystkich okolicznościach, ale w naszym przypadku próbowaliśmy nadpisać
describe
funkcję w Jest, abyśmy mogli przeanalizować nazwę i pominąć całośćdescribe
blok, jeśli spełnia on jakieś kryteria.Oto, co zadziałało dla nas:
Dwie rzeczy, które są tutaj krytyczne:
Nie używamy funkcji strzałek
() =>
.Funkcje strzałkowe zmieniają odniesienie na
this
i potrzebujemy, aby było to plikthis
.Użycie
this.describe
ithis.describe.skip
zamiast justdescribe
anddescribe.skip
.Ponownie, nie jestem pewien, czy jest to wartościowe dla nikogo, ale początkowo próbowaliśmy uciec od doskonałej odpowiedzi Matthew Crumleya, ale musieliśmy uczynić naszą metodę funkcją i zaakceptować parametry, aby przeanalizować je w warunku.
źródło