2016-01-10 28 views
6

znalazłem tej definicji tutaj: https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95#.y0nc8kx34Różnice między klasycznym dziedziczenia i prototypowego dziedziczenia

Nie brzmi to niewygodne dla ciebie? Czy ta definicja ma sens? Dla mnie w obu przypadkach jest użycie konstruktora (z nowym można przesłonić zwracany obiekt, który jest wszystkim) i w obu przypadkach istnieje prototypowe dziedziczenie. Czy brakuje mi czegoś lub powyższa definicja nie jest prawdziwa?

* 3. Jaka jest różnica pomiędzy dziedziczeniem klasycznym a dziedziczeniem prototypowym?

Class Dziedziczenie: przypadki dziedziczą z klasy (jak plan - opis klasy), a także tworzyć relacje podklasy: hierarchicznych taksonomii klasy. Instancje są zazwyczaj tworzone za pomocą funkcji konstruktora za pomocą słowa kluczowego new. Dziedziczenie klas może lub nie może używać słowa kluczowego class z ES6.

Dziedziczenie prototypowe: instancje dziedziczą bezpośrednio z innych obiektów. Instancje są zwykle tworzone za pomocą funkcji fabrycznych lub Object.create(). Instancje może składać się z wielu różnych przedmiotów, co pozwala na łatwą selektywną dziedziczenia. *

+0

To nie jest w porządku. Nawet przy użyciu składni 'class' w ES6 nadal jest prototypowym dziedziczeniem. Różnica nie dotyczy składni deklaracji, ale sposobu jej działania w praktyce. – jfriend00

+0

Cóż, mówi "zwykle". W JS nie ma klasycznego dziedziczenia, tylko składnia, która ukrywa dziedziczenie prototypu. – MinusFour

+0

Wiem dobrze. Czuję, że autor tak naprawdę nie rozumie, jak działa dziedziczenie javascript i miesza je z innymi, bardziej typowymi dla OO językami, ale chcę mieć pewność, że niczego nie brakuje, zanim go obwiniam. –

Odpowiedz

3

W JavaScript, klasa dziedziczenie jest realizowane na szczycie prototypal dziedziczenia, ale to nie znaczy, że robi to samo:

Oprócz dziedziczenia właściwości klasy dziedziczenie ma dodatkowo okablowanie do połączenia dziecko [[Prototyp]] do rodzica [[Prototyp]]. Zwykle wywoływany jest również konstruktor super(). Te dodatkowe kroki tworzą hierarchię nadrzędną/podrzędną i tworzą najściślejsze sprzężenie dostępne w projekcie OO.

Stąd „Zajęcia dziedziczą z klas i tworzyć relacje podklasy. Hierarchicznych taksonomii klasy

Jest to także przydatne do zrozumienia, że ​​jest więcej niż jeden rodzaj prototypal OO. Co ważne, istnieje dziedziczenie konkatenacyjne i delegacja prototypowa.

Dziedziczenie konkatencyjne jest ważne, ponieważ pozwala to na prostą (i bardzo powszechną) kompozycję obiektów w JavaScript. Pamiętajcie, że "Gang Czterech" powiedział: "preferuj kompozycję obiektu ponad dziedziczenie klasowe".

Jest to ogólnie przyjęta mądrość projektu OO, a ze względu na dziedziczenie konkatenatywne, w języku JavaScript jest to proste.

Aby uzyskać więcej informacji, zobacz: "Master the JavaScript Interview: What's the Difference Between Class and Prototypal Inheritance?"

+0

Dziękujemy za odpowiedź! Więc prototypowe dziedziczenie nie tworzy łącza do rodzica [[Prototyp]]? A to oznacza, że ​​nie mogę stworzyć głębokiej hierarchii klas/obiektów z prototypem? –

+0

Co powiesz o różnicy semantycznej? Czy zgadzasz się z moją odpowiedzią? –

+0

Dziedziczenie konkatenatywne nie tworzy hierarchii klas/obiektów, nie. Możliwe jest tworzenie takich hierarchii z delegowaniem prototypów, co jest sposobem implementacji dziedziczenia klas w JavaScript. Tak, istnieje różnica semantyczna między klasą i tak, zgadzam się z twoją definicją, z zastrzeżeniem, że ** "klasa" i typy nie są w ogóle analogiczne w JavaScript **.Programiści oczekują, że będą, co jest powszechnym źródłem nieporozumień. –

4

Istnieje interfejs i semantyczne różnice między „klasa” i „prototypem”.

różnica Interfejs

Jak używać go w kodzie. Różnice i korzyści dobrze wyjaśnione w artykule.

semantyczna różnica

Nieważne jak to realizowane w javascript, możemy użyć ES6 klasy podkreślić, że nasz obiekt ma „klasę” znaczenia. Oryginalnie "klasa" oznacza, że ​​możemy klasa jeśli jakiś obiekt do jednego lub innego zestawu obiektów. Zobacz definicję w teorii mnogości: https://en.wikipedia.org/wiki/Class_(set_theory).

Ponadto, klasa jest czymś abstrakcyjnym i nie istnieje przed utworzeniem instancji.

Jeśli mówimy o dziedziczeniu klas - łatwo zrozumieć abstrakcję, że jakaś klasa może być podklasą innej hierarchii tworzenia klasy.

Prototyp to przykładowy lub reprezentatywny obiekt z niektórych zestawów obiektów. w takim przypadku tworzymy nowe obiekty przy użyciu istniejącego prototypu (tworzenie klonu lub łącza). Mogą też być prototypami dla nowych obiektów.

Kiedy inni programiści odczyta kod i zobaczyć, co wybrać - prototyp lub klasa, oczekują tych semantycznych znaczeń.

+0

'class' i typy nie są analogiczne w JavaScript. Programiści oczekują, że będą, co jest powszechnym źródłem nieporozumień. –