Spędziłem ostatnie kilka godzin próbując znaleźć rozwiązanie mojego problemu, ale wydaje się to beznadziejne.
Zasadniczo muszę wiedzieć, jak wywołać metodę nadrzędną z klasy podrzędnej. Wszystkie rzeczy, które próbowałem do tej pory, kończą się albo nie działają, albo nadpisują metodę nadrzędną.
Używam następującego kodu, aby skonfigurować OOP w javascript:
// SET UP OOP
// surrogate constructor (empty function)
function surrogateCtor() {}
function extend(base, sub) {
// copy the prototype from the base to setup inheritance
surrogateCtor.prototype = base.prototype;
sub.prototype = new surrogateCtor();
sub.prototype.constructor = sub;
}
// parent class
function ParentObject(name) {
this.name = name;
}
// parent's methods
ParentObject.prototype = {
myMethod: function(arg) {
this.name = arg;
}
}
// child
function ChildObject(name) {
// call the parent's constructor
ParentObject.call(this, name);
this.myMethod = function(arg) {
// HOW DO I CALL THE PARENT METHOD HERE?
// do stuff
}
}
// setup the prototype chain
extend(ParentObject, ChildObject);
Najpierw muszę wywołać metodę rodzica, a następnie dodać do niej więcej rzeczy w klasie podrzędnej.
W większości języków OOP byłoby to tak proste, jak wywołanie. parent.myMethod()
Ale naprawdę nie mogę pojąć, jak to się robi w javascript.
Każda pomoc jest mile widziana, dziękuję!
źródło
ParentClass.prototype.myMethod.apply() or
ParentClass.prototype.myMethod.call () `, tak jak robisz to z konstruktorem.ParentClass.prototype.myMethod.call(this, arg1, arg2, arg3...);
)myMethod
na swojej klasie.Styl ES6 umożliwia korzystanie z nowych funkcji, takich jak
super
słowo kluczowe.super
słowo kluczowe dotyczy kontekstu klasy nadrzędnej, gdy używasz składni klas ES6. Jako bardzo prosty przykład, do kasy:Możesz również użyć
super
do wywołania konstruktora nadrzędnego:I oczywiście możesz go użyć, aby uzyskać dostęp do właściwości klasy nadrzędnej
super.prop
. Więc używaj ES6 i bądź szczęśliwy.źródło
super
to nazwać? Czy istnieje odpowiednik w „starym” JS?super()
w metodach statycznych; wygląda na to, że użyłeś go w konstruktorze.Aby to zrobić, nie musisz ograniczać się do
Class
abstrakcji ES6. Dostęp do prototypowych metod konstruktora nadrzędnego jest możliwy poprzez__proto__
właściwość (jestem prawie pewien, że inni programiści JS będą narzekać, że jest zdeprecjonowana), która jest zdeprecjonowana, ale jednocześnie odkryła, że jest to w rzeczywistości niezbędne narzędzie dla potrzeb podklasowania ( szczególnie dla potrzeb podklas Array). Więc chociaż ta__proto__
właściwość jest nadal dostępna we wszystkich głównych silnikach JS, jakie znam, ES6 wprowadził dodatkowąObject.getPrototypeOf()
funkcjonalność.super()
Narzędziem wClass
abstrakcji jest cukier syntaktyczny tego.Więc jeśli nie masz dostępu do nazwy konstruktora nadrzędnego i nie chcesz używać rozszerzenia
Class
abstrakcji, możesz nadal wykonać następujące czynności;źródło
W przypadku wielokrotnego dziedziczenia funkcja ta może być używana jako metoda super () w innych językach. Oto przykładowe skrzypce , z kilkoma testami, możesz tego użyć w ten sposób, wewnątrz swojej metody użyj:
call_base(this, 'method_name', arguments);
Wykorzystuje całkiem nowe funkcje ES, kompatybilność ze starszymi przeglądarkami nie jest gwarantowana. Testowany w IE11, FF29, CH35.
źródło
A co z czymś opartym na pomyśle Douglasa Crockforda:
źródło
Oto dobry sposób, aby obiekty podrzędne miały dostęp do właściwości i metod nadrzędnych przy użyciu łańcucha prototypów JavaScript i jest kompatybilny z Internet Explorerem. JavaScript przeszukuje łańcuch prototypów w poszukiwaniu metod i chcemy, aby łańcuch prototypów dziecka wyglądał następująco:
Instancja dziecka -> Prototyp dziecka (z metodami Child) -> Prototyp rodzica (z metodami Parent) -> Prototyp obiektu -> null
Metody potomne mogą również wywoływać ukryte metody nadrzędne, jak pokazano poniżej przy trzech gwiazdkach ***.
Oto jak:
źródło
Istnieje znacznie łatwiejsze i bardziej kompaktowe rozwiązanie do wielopoziomowego wyszukiwania prototypów, ale wymaga ono
Proxy
obsługi. Zastosowanie:SUPER(<instance>).<method>(<args>)
na przykład, zakładając dwie klasyA
iB extends A
metodąm
:SUPER(new B).m()
.źródło
Chociaż można wywołać metodę nadrzędnej przez prototyp rodzica, trzeba będzie przekazać bieżące wystąpienie dziecko za korzystanie
call
,apply
lubbind
metody.bind
Metoda będzie tworzyć nową funkcję, więc nie polecam, że jeśli zależy Ci na wydajności oprócz niego wywoływana tylko raz.Alternatywnie możesz zastąpić metodę potomną i umieścić metodę nadrzędną w instancji podczas wywoływania oryginalnej metody potomnej.
źródło