Nowy Standard JavaScript
10 godz. 43 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperNa początku dowiesz się jakie nowości pojawiły się w języku, jeśli chodzi o tworzenie zmiennych i stałych. Poznasz dwa nowe słowa let i const, a także dokładnie omówimy ich różnice, względem znanego nam do tej pory słowa var. Następnie poruszymy temat obiektów. Zobaczysz jak nowy zapis pozwoli znaczenie ułatwić nam pracę i sprawić, by kod był bardziej czytelny. W kolejnym rozdziale porozmawiamy o zmianach w funkcjach. Poznasz tzw. arrow functions wraz z poradami, kiedy z nich korzystać, a także z konsekwencjami ich użycia. Zobaczysz również, jak korzystać z domyślnych parametrów. Następną nowością będą operatory rest i spread, które znacząco uproszczą pisanie kodu dla funkcji i tablic. Chwilę później rzucimy okiem na bardzo ciekawy temat, mianowicie na tzw. destructuring. To nowa funkcja języka, która pozwala w łatwy sposób wyciągnąć odpowiednie dane z tablic i obiektów, nawet jeżeli te posiadają kilkupoziomową, zagnieżdżoną strukturę. Zmian doczekały się również ciągi znaków. Poznasz nowy zapis, tzw. template string, a także możliwość wykorzystania funkcji tagujących.
ES6 wprowadza do języka JavaScript zapis klas. I choć na początku wydaje się, że to duży krok w stronę klasycznych obiektowych języków programowania, to jak się przekonasz, jest to w dużej mierze tzw. syntactic sugar, a więc zupełnie nowy, prostszy zapis, a prawie identyczne jak wcześniej działanie, oparte na dziedziczeniu prototypowym. W kursie poruszymy również temat Symboli oraz tego jak z nimi pracować, a chwilę później poznasz iteratory. To konstrukcje ułatwiające iterację, które znacząco upraszczają pracę z kolekcjami danych. Wraz z iteratorami poznasz również generatory, które ułatwiają z kolei tworzenie tych iteratorów. Istotną nowością w ES6 są również natywne Promise. To sposób na rozwiązanie problemu asynchroniczności, który znamy od bardzo dawna w postaci różnych bibliotek. Od teraz jednak Promisy znajdują się bezpośrednio w języku. Nowymi konstrukcjami, które pozwalają pracować z kolekcjami danych, są Map i Set. Dowiesz się jak z nich korzystać, a także do czego są przydatne. W jednym z rozdziałów rzucimy też okiem na tzw. Proxy API. To mechanizm języka, który pozwala na dość niskopoziomowy dostęp do różnych operacji. I choć być może nie jest to coś, z czego będziesz korzystał nad wyraz często, to warto wiedzieć, jakie są nowe możliwości tego API.
Jedną z najlepszych nowości, która zawitała do języka JavaScript wraz z ES6 są moduły. To możliwość dzielenia kodu na wiele plików, z których można pewne wartości wyeksportować, a następnie zaimportować je w innych modułach. Tutaj dowiesz się wszystkiego, co z modułami związane. Zobaczysz wiele sposobów na eksport i import, a także jak pracować z modułami w przeglądarkach internetowych. Kurs skupia się na omówieniu wszystkich najważniejszych nowości w ES6, dzieląc je na rozdziały. Jeden z nich natomiast, poświęcony został omówieniu mniejszych zmian, które znalazły się w specyfikacji. Poznasz w nim np. nowe metody tablic czy ulepszoną współpracę z Unicode.
Specyfikacja EcmaScript 2015 wprowadziła naprawdę bardzo wiele zmian, ale jej twórcy założyli, że od tego czasu każda kolejna wersja specyfikacji będzie pojawiać się co roku. Oznacza to przede wszystkim, że nie będziemy na raz bombardowani aż tak wieloma zmianami, jak w 2015 roku. W tym kursie nie zabrakło zatem omówienia nowości ze specyfikacji ES2016 oraz 2017, gdzie poznasz np. nowe metody dla stringów czy funkcje asynchroniczne.
Kiedy będziesz już uzbrojony w solidną wiedzę z zakresu nowości w ES6, dowiesz się jak w praktyce pracuje się dzisiaj z tym standardem. W jednym z rozdziałów omówimy nowoczesny workflow z użyciem npm i wykorzystamy popularne narzędzie webpack, do pracy z modułami, a także do transpilowania kodu ES6 do wersji ES5. Dzięki temu nowoczesny kod, który napiszemy, będzie mógł być uruchamiany również w starszych przeglądarkach, które nie wspierają najnowszego standardu. Dowiesz się na co zwrócić uwagę, by wszystko działało bez zarzutu.
Zwieńczeniem tego kursu będzie praktyczny projekt, w którym od podstaw wykonamy swoją własną bibliotekę do pracy z Obiektowym Modelem Dokumentu. Będzie ona w działaniu nieco podobna do znanej chyba wszystkim biblioteki jQuery. Na tym przykładzie postaramy się wykorzystać jak najwięcej wiedzy z zakresu ES6 zdobytej wcześniej. Stworzymy metody do pracy z drzewem dokumentu, a więc do wyszukiwania elementów, do tworzenia nowych, do przypisywania im klas, atrybutów czy styli CSS. Nie zabraknie również modułu odpowiedzialnego za współpracę z Ajax. Cały kod utworzymy oczywiście w sposób modułowy, aby bibliotekę można było łatwo rozwijać w przyszłości. Na koniec projekt ten przetranspilujemy do kodu ES5 z użyciem Babel i przetestujemy w starszej przeglądarce Internet Explorer 11, aby upewnić się, że nasza biblioteka działa poprawnie.
Kurs ten jest dla wszystkich osób, które znają już język JavaScript i czują się w pracy z nim swobodnie. Jeśli zatem chciałbyś pracować z nowoczesnym kodem JavaScript, to ten kurs jest zdecydowanie dla Ciebie. A może masz zamiar poznać framework Angular lub bibliotekę React? Tam również wykorzystywany jest najnowszy zapis ES6, więc wiedza ta będzie naprawdę pomocna. Z solidną wiedzą z zakresu EcmaScript 6, bez trudu pozostaniesz na bieżąco z każdą kolejną edycją tej specyfikacji.
Wiesz jak działają gettery i settery, dlatego teraz mogę ci pokazać coś co jest nowością,
właśnie dostępną w EcmaScript 6 i jest to tak zwane Proxy API. Nie
jest to być może coś z czego będziesz bardzo często korzystał. Dlatego też nie będziemy tego bardzo
gruntownie wszystkich metod jakie są dostępne omawiać w tym kursie. Natomiast chciałbym
ci pokazać na czym to polega i w kolejnej lekcji jeszcze jedną z tych metod sobie
wykorzystamy i pokażę ci gdzie znaleźć kolejne. Natomiast zaczniemy sobie, jak
to mówią, od początku, czyli mam taki prosty obiekt i w lekcji poprzedniej pokazałem ci,
że w ES5 możemy dodać sobie getter'y lub setter'y. Natomiast
mówiłem ci, że gdybym chciał przechwycić, że ktoś napisał na przykład age kropka age, to
nie mogłem tego zrobić jeżeli nie przypisałam sobie setter'a lub getter'a, właśnie
dla age. Teraz będę mógł utworzyć sobie w EcmaScript 6 tak zwany obiekt Proxy, któremu
mogę przekazać już istniejący obiekt i na tym Proxy będziemy pracować,
czyli będzie to taki pośrednik. Dlatego napiszę sobie let Proxy, tak
nazwę zmienną i zrobimy new Proxy. To jest znowu nowy
konstruktor, który wywołujemy z new. Jako pierwszy parametr przekazujemy mu
obiekt, nad którym chcemy utworzyć taki Proxy taki w wrapper,
czyli chcemy go opakować, więc napiszmy person, czyli ten który mamy u góry i
jako drugi podajemy obiekt, taki literał obiektu, w którym
będą różne metody. Zaraz do tych metod sobie przejdziemy, natomiast ja chciałbym
skorzystać z metody get. Możemy napisać tak albo
w skróconym właśnie takim zapisie, który znamy ES6, że on w obiektach
jest dostępny i to już nie jest getter, taki jak w lekcji poprzedniej, gdzie pisałem get i nazwa
funkcji. To jest po prostu tutaj normalna funkcja wstawiona do tego literału obiektu,
która musi mieć nazwę get. Funkcja będzie miała tutaj swoje ciało, natomiast
przyjmuje kilka parametrów. Pierwszy to będzie target i będzie to
właśnie ten obiekt, na którym wywołało się takie zdarzenie. Można mówić
o tym, że jest to zdarzenie, bo to w pewnych momentach będzie się wywoływać. Jako drugi
będziemy mieli property, czyli będzie to właściwość i o tym ci mówiłem wcześniej,
że jeżeli ktoś skorzysta na przykład z age, chciałbym móc to jakoś odczytać. Tutaj
będę miał taką możliwość i jako trzeci będzie to receiver i tym
razem będzie to jakby już ten obiekt proxy, czyli to będzie to, co pod proxy i zróbmy
sobie teraz console.log target, console.log property
i console.log receiver i teraz
kiedy nam się to wywoła. Powiem ci od razu, że nie wtedy, kiedy na obiekcie będziemy
cokolwiek robić, tylko na obiekcie Proxy, więc ten Proxy, tak naprawdę nie jest,
można powiedzieć, że niewidzialny z tego powodu, zobaczymy,
że jeżeli z niego skorzystam proxy firstName, to
mogę z tego skorzystać, co prawda została zwrócona wartość undefined, ale o tym za moment,
ale zobacz, że wykorzystaliśmy firstName i wywołała się nasza funkcja
get i jeszcze na sekundę czym jest ta funkcja. Otóż te funkcje nazywają się pułapkami,
czyli z angielskiego trwa, a więc możesz na takim dowolnym obiekcie zastawić
różne pułapki, o których za moment. Jedną z pułapek jest get, która wywołała
się wtedy, kiedy ktoś spróbuje pobrać jakąś właściwość takiego obiektu. Zauważ,
że ona się wywołała i pod target w console.log'u mamy tenże
właśnie obiekt, czyli Object jako property mamy firstName,
a jako receiver mamy proxy, czyli cały ten obiekt proxy. Jeżelibyśmy
napisali proxy na przykład age. Zauważ, że w tym obiekcie age, w ogóle nie
istnieje, to też uruchomi się nasza funkcja, gdzie pod property będę
miał age. To teraz pytanie brzmi, w jaki sposób możemy zwrócić domyślne
wartości, bo gdybym tutaj napisał person firstName, to
mamy Jan, ale jeżeli napisze proksy firstName, to jak widzisz
nasz get się wywołał, ale nic nie zwróciliśmy, więc mamy tutaj undefined. Od
razu ci powiem, że Proxy API współpracuje z tak zwanym Reflect API. One
są stworzone po to, żeby pracować razem. Dlatego tutaj będę chciał w tej
funkcji zwrócić Reflect. Jest to taki globalny
obiekt. Następnie get, czyli nazwa tej metody będzie zawsze taka sama, jak
nazwa pułapki jaką zastawiliśmy i praktycznie parametry też zawsze są takie same,
czyli przekażę target, property i receiver i zobaczymy
teraz jaki będzie efekt. Jeżeli teraz bym napisał proxy firstName, to
będę miał tutaj Jan, czyli tak naprawdę wszystko zadziałało tak samo,
bo domyślna wartość została zwrócona, ale ja mogłem przechwycić, że
ktoś w ogóle czegoś takiego skorzystał. Spróbujmy napisać proxy age i widzimy,
że jest to wartość undefined domyślna, bo nigdzie tej wartości tutaj nie ma. Natomiast
mógłbym teraz, mając już coś takiego sprawdzić sobie if property
równa się age prawda, to coś co z tym zrobić i teraz na
tym przykładzie chciałbym ci podać praktyczny przykład. W JavaScripcie często jest
taka konwencja, że jeżeli jakieś dane w obiekcie mają być ukryte, to robimy je podkreślnikiem. Na
przykład w ten sposób. One nie są co prawda ukryte. Można się do nich dostać, tylko
taka nazwa, ale to pokazuje innym deweloperom, którzy korzystają z naszego kodu, że
tych wartości nie powinno się odczytywać bezpośrednio i gdybyśmy z
jakiegoś naszego kodu zwrócili takie proxy, to moglibyśmy taką wartość dodatkowo
sobie ukryć. Zauważ, że moglibyśmy zrobić tak, że jeżeli property
i wiemy, że jeżeli ktoś skorzysta
z proxy age, to property
to będzie będzie taki string, podkreślnik age, więc jeżeli property charAt.
Jest to metoda string'u, która pozwoli mi pobrać znak pod
indeksem zero. Jeżeli on się równa podkreślnik, więc może to być podkreślnik
age lub cokolwiek innego, to wtedy chciałbym zwrócić undefined,
czyli tak jakby tego zupełnie w tym obiekcie nie było. Natomiast w przeciwnym wypadku właśnie
chcę zwrócić wartość domyślną, dlatego przekazuje, to dalej do Reflect, tutaj
do metody get i przekazuje mu wszystkie te potrzebne parametry, to ona wtedy zwróci wartość
domyślną. No i sprawdźmy teraz proxy age zwraca undefined. Mimo
tego, że w tym obiekcie person mamy coś takiego jak age. Natomiast proxy
na przykład firstName zwróci nam już Jan. No
i teraz pytanie czy to będzie dla ciebie przydatne w twojej codziennej pracy. Nie wiem, natomiast chciałbym
ci pokazać jeszcze kilka pułapek, które można tutaj zastawić, dlatego przejdziemy
sobie na stronę Mozilla Developer Network.
Pokażę ci jakie są pułapki i z jednej z nich jeszcze skorzystam w lekcji
kolejnej, czyli tutaj gdybyśmy sobie przeszlki, to wszystkie pułapki znajdziesz
właśnie w tym miejscu. Na przykład getPrototypeOf czy setPrototypeOf i jeszcze
kilka innych. My skorzystaliśmy z get, ale również można ustawić na przykład
set. Zauważ, że to nam pozwala, podobnie jak symbole wbudowane, o
których już mówiliśmy w tym kursie na takiej niskopoziomowy dostęp do tego, co dzieje się
w tym języku JavaScript. Bo zauważ, że mamy na przykład pułapkę delete
property, która się wywoła wtedy, kiedy ktoś na naszym obiekcie
zrobiłby delete proxy, na przykład firstName. Wcześniej
nie mieliśmy możliwości przechwycenia czegoś takiego, a teraz jeżeli ktoś chciałby usunąć
firstName, to właśnie pułapka delete, którą moglibyśmy zastawić. Oczywiście polecam
ci abyś z tym poeksperymentował i w przypadku każdej z tych pułapek zobaczył jakie
konkretnie parametry tutaj są przekazywane i co powinniśmy zwrócić z funkcji. Natomiast
zawsze najlepiej jest skorzystać z Reflect, przekazując te parametry, bo reflect
na przykład w przypadku delete zwróci ci true lub false, bo okazuje się, że
taki zapis w JavaScript'cie zwraca nam true lub false czy uda się usunąć
jakąś właściwość czy nie. Dlatego ważne jest korzystanie z Reflect, bo Reflact po pierwsze pozwoli
na przykład usunąć taką właściwość, a po drugie zwróci poprawnie true lub false w to
miejsce i ty zwrócisz to dalej. Jak zatem widzisz, możemy takie pułapki zastawiać,
więc przeczytaj sobie tutaj do czego one służą. Polecam
ci abyś sobie ewentualnie z tym poeksperymentował. No i być może znajdziesz w swoim,
swojej pracy takie przypadki, gdzie będzie to dla ciebie przydatne. Niemniej
jednak widzisz, że taka możliwość została dodana, no i można z niej skorzystać.