klasa a funkcja różnice JS

klasa a funkcja różnice JS

Wątek przeniesiony 2016-12-25 13:24 z Webmastering przez Ktos.

L9
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Kraków
  • Postów:129
0

Witam,

mam pytanie, jakie są właściwe główne, istotne różnice miedzy klasa a funkcja w JS?

Patryk27
Twoje pytanie brzmi jak jakie są główne różnice między młotkiem a samochodem wyścigowym :P
L9
wbrew pozorom wcale nie takie łatwe pytanie, a chcę mieć profesjonalnie opisane. Jedyną różnicą jaką widzę, że w klasach łatwiej zrobić dziedziczenie, w tym dziedziczenie wbudowanych klas.
Patryk27
To nie jest łatwe pytanie, ale tylko z tego powodu, iż nie ma ono sensu. Jakie w ogóle widzisz podobieństwo między klasami a funkcjami, skoro chcesz poznać różnice?
LukeJL
każda klasa jest i tak funkcją-konstruktorem pod spodem.
Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
0

Klasa w JS to wyspecjalizowana funkcja służąca do tworzenia obiektów w konkretny sposób na bazie prototypu. To cukier składniowy dla funkcji-konstruktora i metod prototypu. W JS każda klasa jest funkcją, ale nie każda funkcja jest klasą.

Zobacz pozostały 1 komentarz
dzek69
"Cukier składniowy" o.O Pomijając, że parę hardkorów próbuje to tłumaczyć, to mógłbyś to jednak opisać normalnymi słowami, bo u nas tego określenia się nie używa za bardzo nawet po angielsku, więc nieogarnięty i tak złapie wtfa.
Maciej Cąderek
Maciej Cąderek
Jeśli OP nie zrozumiałby terminu to by napisał. Widać zrozumiał, bo zaakceptował odpowiedź - nie ma co szukać dziury w całym (swoją drogą to w moim odczuciu raczej popularny termin).
czysteskarpety
czysteskarpety
cukier składniowy VanillaJS :D
Maciej Cąderek
Maciej Cąderek
@czysteskarpety: :D
Marooned
"cukier składniowy" również przykuł moją uwagę, bo dopiero co w komentarzach o tym pisaliśmy "Pytam się" czy "Pytam"?
bobojak
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 3 lata
  • Postów:26
1

Ten cukier składniowy (class) jest niezbędny do wabienia ludzi, których 'callback hell' itp. odstrasza od JS. To co się dzieje na naszych oczach, to próba eliminacji wesołej twórczości na x sposobów tworzenia obiektów mających jakieś znaczenie dla 'większej' aplikacji.


"Jakie to proste, przejść przez przeszkodę mostem" // Apteka
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
0
Kopiuj
class ClassicalCar {}
typeof ClassicalCar
// "function"

class ModernCar extends ClassicalCar {}
ModernCar.prototype
// ClassicalCar {}

function FunctionalCar() {}
typeof FunctionalCar
// "function"

function ModernFunctionalCar() {}
ModernFunctionalCar.prototype = Object.create(FunctionalCar.prototype);
ModernFunctionalCar.prototype
// FunctionalCar {}
edytowany 1x, ostatnio: Desu
IE
IE
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:317
1

Myślę, że warto odpuścić klasy w JS. I tak pod spodem będą to zwykłe funkcje i "prototype". Za dużo zamieszania.

Zobacz pozostały 1 komentarz
dzek69
Trochę się pod tym podpisuję. Bo na cholerę Ci klasa, skoro i tak nie ma prywatnych? Jedyny sensowny workaround to klepanie wszystkiego prywatnego (albo co wymaga dostępu do prywatnych) w konstruktorze, co wygląda identycznie jak "klasa" zbudowana przy pomocy ES5, tyle. że otaczasz to class i constructor, a odejmujesz return this
LukeJL
dlatego ja tworzę obiekty bez żadnych klas, tylko używając funkcji-fabryki, i mam tam prywatne zmienne.
spartanPAGE
czyli jednak ts ma sporo sensu ;P
LukeJL
Jeśli ktoś lubi programowanie oparte o klasy to pewnie tak.
Maciej Cąderek
Maciej Cąderek
A to w sumie ciekawy temat - kto czego faktycznie używa do obiektówki, możnaby machnąć wątek.
0

Na przykladzie Angulara 1.5.x . Tam wykorzystywanie klas nie ma sensu, skoro i tak - jak ktos powiedzial, nie ma metod prywatnych. Dlatego, tak czy inaczej trzeba zrobic funkcje, zeby ta prywatnosc zachowac. I na pomoc przychodzi TypeScript. Ucze sie teraz angulara2 i wyglada to znaacznie lepiej.

LukeJL
ale przecież w Angularze jedynce ukrywanie danych istnieje na poziomie Angulara jako takiego (każda dyrektywa ma swój $scope w końcu).
0

Hasło warte przytoczenia w kontekście tematu: prekompilacja javascript.
Klasa to tylko lukier składniowy w przypadku zagmatwanego, ale topowego javascriptu, co już kolega zapewne bardziej biegły ode mnie przytoczył. Klasy sensu stricte na wzór chociażby tych javowych w js nie istnieją. Akurat w przypadku js klasa jest pojęciem węższym, funkcja jest pojęciem szerszym.

ps. uważam że dobrze, iż w Es5/6 (nie pamiętam) pojawiło się słowo kluczowe class, uprości to kod w przypadku zastosowania konkretnego wzorca.

bobojak
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 3 lata
  • Postów:26
0

Miałem okazję z bardzo bliska przyglądać się rozwojowi języka ActionScript (podobnie jak JS opartemu o ECMAScript) od wersji 1.0, poprzez 2.0, po 3.0 i agonię:/ W mojej opinii JS podąża tą drogą i znajduje się obecnie tam gdzie AS był w 2004 roku (rok wcześniej wprowadzono wersję 2.0 i klasy):
https://en.wikipedia.org/wiki/ActionScript#Timeline_by_ActionScript_version

Po dodaniu TypeScript JS zaczyna się lekko ocierać o rok 2006 dla ActionScript (wersja 3.0), choć do AS3, JS w obecnej postaci jest nadal 'ho ho' daleko. IMHO to jedyna słuszna droga i jednocześnie nadzieja, że za 3 lata wspomnienia o prototype będą się pojawiały jedynie na wieczorkach kombatanckich developerów JS z doświadczeniem 5+ lat.


"Jakie to proste, przejść przez przeszkodę mostem" // Apteka

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.