Czy można symulować abstrakcyjną klasę bazową w JavaScript? Jaki jest najbardziej elegancki sposób na zrobienie tego?
Powiedz, chcę zrobić coś takiego: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Powinien wyświetlić: „szczekanie”, „miauczenie”
javascript
oop
abstract
Sabya
źródło
źródło
Odpowiedzi:
Prosty sposób na utworzenie klasy abstrakcyjnej jest następujący:
Animal
„Klasa” isay
metoda są abstrakcyjne.Utworzenie instancji spowodowałoby błąd:
W ten sposób „dziedziczysz” po nim:
Dog
wygląda właśnie tak.A tak rozgrywa się Twój scenariusz:
Skrzypuj tutaj (spójrz na wyjście konsoli).
źródło
Klasy JavaScript i dziedziczenie (ES6)
Zgodnie z ES6, możesz używać klas JavaScript i dziedziczenia, aby osiągnąć to, czego potrzebujesz.
Źródła: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Przede wszystkim definiujemy naszą klasę abstrakcyjną. Nie można utworzyć wystąpienia tej klasy, ale można ją rozszerzyć. Możemy również zdefiniować funkcje, które muszą zostać zaimplementowane we wszystkich klasach rozszerzających tę.
Następnie możemy stworzyć nasze konkretne klasy. Te klasy odziedziczą wszystkie funkcje i zachowania z klasy abstrakcyjnej.
A wyniki ...
źródło
Czy masz na myśli coś takiego:
źródło
whattosay
nie jest zdefiniowane w zwierzęciu ) i że ta odpowiedź wyraźnie pyta czy proponowana odpowiedź była tym, czego szukał pytający. Nie twierdzi, że daje rozwiązanie dla klas abstrakcyjnych w javascript. Pytający nie zadał sobie trudu, aby odpowiedzieć mnie ani nikomu innemu, więc nie mam pojęcia, czy to zadziałało dla niego. Przepraszam, jeśli pięciolatka zaproponowana przez kogoś innego nie zadziałała.Możesz sprawdzić klasę podstawową Deana Edwardsa: http://dean.edwards.name/weblog/2006/03/base/
Alternatywnie, istnieje ten przykład / artykuł autorstwa Douglasa Crockforda na temat klasycznego dziedziczenia w JavaScript: http://www.crockford.com/javascript/inheritance.html
źródło
Na pewno. Istnieje około tysiąca sposobów implementacji systemów klas / instancji w JavaScript. Tutaj jest jeden:
Nie jest to oczywiście abstrakcyjna klasa bazowa. Czy masz na myśli coś takiego:
źródło
źródło
Nie ma gwarancji, że zadziała, ponieważ
__proto__
nie jest to zmienna standardowa, ale działa przynajmniej w Firefoksie i Safari.Jeśli nie rozumiesz, jak to działa, przeczytaj o łańcuchu prototypów.
źródło
setPrototypeOf
jeszcze metody, której potrzebowałbym do mojego kodu.Możesz tworzyć klasy abstrakcyjne za pomocą prototypów obiektów, prosty przykład może wyglądać następująco:
Możesz zmienić powyższą metodę lub nie, to od Ciebie zależy, kiedy ją zastosujesz. Aby uzyskać szczegółową obserwację, możesz odwiedzić tutaj .
źródło
Pytanie jest dość stare, ale stworzyłem możliwe rozwiązanie, jak stworzyć abstrakcyjną „klasę” i blokować tworzenie obiektów tego typu.
Jak widać ostatni obiekt daje nam błąd, to dlatego, że Animal w prototypie ma własność
abstract
. Aby mieć pewność, że jest to Animal, a nie coś, co maAnimal.prototype
w łańcuchu prototypów, robię:Więc sprawdzam, czy mój najbliższy obiekt prototypowy ma
abstract
właściwość, tylko obiekt utworzony bezpośrednio zAnimal
prototypu będzie miał ten warunek na true. FunkcjahasOwnProperty
sprawdza tylko właściwości aktualnego obiektu, a nie jego prototypów, więc daje nam to 100% pewności, że właściwość jest zadeklarowana tutaj, a nie w łańcuchu prototypów.W mojej propozycji nie musimy zmieniać za
constructor
każdym razem,Object.create
jak to jest w aktualnej najlepszej odpowiedzi @ Jordão.Rozwiązanie umożliwia również tworzenie wielu abstrakcyjnych klas w hierarchii, wystarczy stworzyć
abstract
własność w prototypie.źródło
Inną rzeczą, którą możesz chcieć wymusić, jest upewnienie się, że twoja klasa abstrakcyjna nie została utworzona. Możesz to zrobić, definiując funkcję, która działa jak funkcje typu FLAG ustawione jako konstruktor klasy abstrakcyjnej. To następnie spróbuje skonstruować FLAG, który wywoła swój konstruktor zawierający wyjątek do wyrzucenia. Przykład poniżej:
źródło
JavaScript może mieć dziedziczenie, sprawdź poniższy adres URL:
http://www.webreference.com/js/column79/
Andrzej
źródło
Factory
W tym przypadku możemy użyć wzorca projektowego. Wykorzystanie JavaScriptprototype
do dziedziczenia członków rodzica.Zdefiniuj konstruktora klasy nadrzędnej.
A następnie utwórz klasę dla dzieci.
Następnie zdefiniuj konstruktora klasy podrzędnej.
Sprawdź to.
Oto link Codepen do pełnego przykładowego kodowania.
źródło
źródło
Myślę, że wszystkie te odpowiedzi, szczególnie pierwsze dwie (przez niektórych i jordão ) dają jasną odpowiedź na to pytanie za pomocą konwencjonalnej koncepcji prototypowej bazy JS.
Ponieważ chcesz, aby konstruktor klasy zwierząt zachowywał się zgodnie z przekazanym do konstrukcji parametrem, myślę, że jest to bardzo podobne do podstawowego zachowania
Creational Patterns
na przykład wzorca fabrycznego .Tutaj zrobiłem małe podejście, aby to działało w ten sposób.
źródło
Animal
konstruktor może być postrzegany jako anty-wzorzec, nadklasa nie powinna mieć wiedzy o podklasach. (narusza zasadęźródło
Jeśli chcesz się upewnić, że twoje klasy bazowe i ich składowe są ściśle abstrakcyjne, oto klasa bazowa, która robi to za Ciebie:
Tryb ścisły uniemożliwia zalogowanie obiektu wywołującego w metodzie throwAbstract, ale błąd powinien wystąpić w środowisku debugowania, które pokazywałoby ślad stosu.
źródło