Wpis z mikrobloga

Mój znajomy, front-endowiec dzisiaj podczas naszej dyskusji o przyszłości #javascript:

No ale w ES6 dodany został syntax class Foo(){ ... } więc JavaScript jest już w pełni obiektowo orientowanym językiem jak Java czy PHP.


Szkoda tylko że w JS - technicznie - nie ma i nigdy nie było czegoś takiego jak klasa czy instancjonowanie xD
  • 14
@Greg36: zależy jak na to patrzysz i pod jakim kątem, czy języka czy jego implementacji :)

oczywistym jest że obiekt w javascript to jest hashmapa której kluczem jest string a wartością jest dowolna wartość javascriptowa. czyli deklarując obiekt pos = { x: 522 , y: 566 }; tworzysz hashmapę z dwoma kluczowartościami x,y. gdy potrzebujesz pobrać wartość "y" to silnik wykonuje wyszukiwane btree po hashmapie i znajduje Twój klucz...

ale implementacyjnie
@larvaexotech: Na optymalizacjach V8 się nie znam, ale pojawienie się w samym standardzie class świadczy o tym że to właśnie w taki sposób ludzie programują JS a silnik jak widać jest optymalizowany pod taki kod.

@Johnny_: @ves666: W skrócie JavaScript nie jest językiem bazującym na klasach ale językiem bazującym na prototypach.

W JS używając new np. var foo = new Bar(); nie tworzymy nowej instancji na podstawie schematu
Greg36 - @larvaexotech: Na optymalizacjach V8 się nie znam, ale pojawienie się w samy...

źródło: comment_KBsOUgArgHXWOx6yP1DJFWGCdwtx2vYL.jpg

Pobierz
@Greg36: dziedziczenie prototypów (obok klasycznych klas) jest też metodą realizacji paradygmatu programowania obiektowego i pozwala na używanie podobnych rozwiązań architektonicznych.

To trochę tak jakbyś powiedział że w JS nie da się pisać kodu funkcyjnego bo nie obsługuje pattern matchingu w sygnaturach funkcji.
@ves666: Nigdy nie napisałem że JS to nie jest język orientowany obiektowo.

więc JavaScript jest już w pełni obiektowo orientowanym językiem jak Java czy PHP.


To porównanie jest błędne bo JS w tworzeniu "klas" i instancji fundamentalnie różni się od Javy czy PHP co opisałem wyżej.
@Greg36: Ale jaką to różnice robi Ci w faktycznym używaniu JS w formie takiej jak w Javie i PHP. Dla mnie jedynym argumentem jest to, że nie wspiera pól private i protected. Natomiast fakt że 'under the hood' słowo kluczowe class tak naprawdę zwraca funkcję-konstruktora z ustawionym odpowiednio .prototype nie stanowi argumentu w tej dyskusji. To, że class jest przez wirtualną maszynę JSa tłumaczone na prototypy wynika bardziej z faktu, że
W JS używając new np. var foo = new Bar(); nie tworzymy nowej instancji na podstawie schematu (definicji klasy) tylko [...].


@larvaexotech: To jest właśnie fundamentalna różnica która ma duże znaczenie.

Przez to że JS działa na bazie tworzenia prototypów (niezależnie od syntaxu czy interpretera) a nie instancjonowaniu obiektów na podstawie definicji klasy, możemy po wyinstancjonowaniu modyfikować "definicję klasy" (bo jest to po prostu obiekt a nie definicja) co nie
@Greg36:

a nie instancjonowaniu obiektów na podstawie definicji klasy,


no to Ci tłumaczyłem że V8 tworzy obiekty na podstawie definicji klasy stosując memory layout analogiczny do tego co jest np. w Javie (tzn. obiekt jest strukturą bajtów a nie słownikiem klucz:wartość). Natomiast wykonywanie metody obiektu np pos.set(5,5) powoduje wykonanie metody "set" z PROTOTYPU klasy a nie wynikowego obiektu stworzonego w konstruktorze. To znaczy, że instancja każdego obiektu nie posiada własnej kopii
no to Ci tłumaczyłem że V8 tworzy obiekty na podstawie definicji klasy


@larvaexotech: No i co z tego że jeden z silników tak robi optymalizację jak w standardzie JavaScript nie ma czegoś takiego jak definicja klasy. "Definicją klasy" w JS jest obiekt - prototyp, w PHP czy Javie definicja klasy to definicja klasy.

To znaczy, że instancja każdego obiektu nie posiada własnej kopii funkcji, tylko wskaźnik do swojego prototypu.

No dokładnie
@Greg36: Nie no mimo szczerych chęci nie potrafię się z Tobą zgodzić kolego :)

Prototyp jest bardzo zbieżny z klasą tak naprawdę, a sensowna różnica jest taka, że klasa zawiera w sobie również definicje PÓL obiektu, natomiast prototyp tylko definicje jego metod.

Co do pkt drugiego o dostępie do klasy to tak, "klasę" (prototyp) można modyfikować w JS z runtime. W C++ jest to niemożliwe, w Javie i PHP za pomocą
Natomiast co do meritum - jak chcesz udowodnić koledze że ES6 nie jest językiem w pełni obiektowym to nie używaj argumentów z dupy


@larvaexotech: Napisałem ten post przez to nietrafione porównanie:

No ale w ES6 dodany został syntax class Foo(){ ... } więc JavaScript jest już w pełni obiektowo orientowanym językiem jak Java czy PHP.


JS jest i od swoich korzeni było językiem zorientowanym obiektowo. Dodanie syntaxu class - tak jak