Jest tu około stu zagadnień terminologicznych, głównie wokół kogoś (nie ciebie), który stara się, aby ich pomysł brzmiał jak najlepszy.
Wszystkie języki obiektowe muszą być w stanie poradzić sobie z kilkoma pojęciami:
- enkapsulacja danych wraz z powiązanymi operacjami na danych, zwanymi między innymi elementami danych i funkcjami elementów, lub jako dane i metody.
- Dziedziczenie, możliwość stwierdzenia, że te obiekty są takie same, jak inny zestaw obiektów Z WYJĄTKIEM tych zmian
- polimorfizm („wiele kształtów”), w którym obiekt sam decyduje, jakie metody mają zostać uruchomione, dzięki czemu można polegać na języku, aby poprawnie kierować żądania.
Teraz, jeśli chodzi o porównanie:
Pierwszą rzeczą jest całe pytanie „klasa” kontra „prototyp”. Pomysł pierwotnie rozpoczął się w Simula, gdzie za pomocą metody opartej na klasach każda klasa reprezentowała zestaw obiektów, które dzieliły tę samą przestrzeń stanu (czytaj „możliwe wartości”) i te same operacje, tworząc w ten sposób klasę równoważności. Jeśli spojrzysz wstecz na Smalltalk, ponieważ możesz otworzyć klasę i dodać metody, jest to faktycznie to samo, co możesz zrobić w JavaScript.
Później języki OO chciały mieć możliwość statycznego sprawdzania typów, więc otrzymaliśmy pojęcie ustalonego zestawu klas w czasie kompilacji. W wersji otwartej miałeś większą elastyczność; w nowszej wersji można było sprawdzić niektóre rodzaje poprawności w kompilatorze, które w innym przypadku wymagałyby testowania.
W języku „klasowym” kopiowanie odbywa się w czasie kompilacji. W języku prototypowym operacje są przechowywane w prototypowej strukturze danych, która jest kopiowana i modyfikowana w czasie wykonywania. Jednak abstrakcyjnie klasa jest nadal klasą równoważności wszystkich obiektów, które mają tę samą przestrzeń stanu i metody. Dodając metodę do prototypu, skutecznie tworzysz element nowej klasy równoważności.
Dlaczego to robisz? przede wszystkim dlatego, że tworzy prosty, logiczny i elegancki mechanizm w czasie wykonywania. teraz, aby utworzyć nowy obiekt lub nową klasę, wystarczy wykonać głęboką kopię, kopiując wszystkie dane i prototypową strukturę danych. Otrzymujesz dziedziczenie i polimorfizm mniej więcej za darmo: wyszukiwanie metody zawsze polega na pytaniu słownika o implementację metody według nazwy.
Powodem, dla którego skończyło się skryptem JavaScript / ECMA, jest to, że kiedy zaczynaliśmy 10 lat temu, mieliśmy do czynienia ze znacznie słabszymi komputerami i znacznie mniej zaawansowanymi przeglądarkami. Wybór metody opartej na prototypach oznaczał, że interpreter może być bardzo prosty, zachowując pożądane właściwości orientacji obiektowej.