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.
W tej lekcji pokażę ci jak delegować generatory. Co to jest już ją
przekonasz. Mamy tutaj kod, który widzieliśmy wcześniej, ale na razie go nie odkomentowuje. Zostawiłem
go tutaj, żebyś mógł sobie go za moment odkomentować, żebyś nie musiał kopiować. Najpierw
jednak będę chciał ci pokazać, na czym polega delegacja generatorów. Utworzymy
sobie funkcje generatora, która się będzie nazywała gen i pamiętasz,
że mogliśmy robić na przykład yield1 i
powiedzmy yield2. Zrobimy
sobie to w ten sposób i utworzymy teraz nową zmienną, którą nazwiemy
sobie iteratorem albo nawet nie będziemy jej tworzyć, tylko od razu zrobimy pętle
for of i tutaj będzie let value
of gen, czyli wywołamy sobie ten generator. Pamiętasz, że to zwróci iterator
i będziemy po nim iterować. To już wiedziałeś, więc tutaj się tylko powtarzamy. Powinniśmy
zobaczyć 1 i 2. Dokładnie tak się stało, ale teraz okazuje się,
że możemy wewnątrz dowolnego generatora zrobić coś co nazywa się delegacją
generatorów, czyli tutaj mógłbym napisać yield i następnie
postawić tablice, która miałaby 2, 3, 4, a powiedzmy,
że tutaj będzie 5. Pytanie, co się teraz stanie. Nic takiego. Zostanie
zwrócone jeden, potem tablica, a potem 5. No bo tym yield wyrzuciłem
sobie tablice, ale jeżeli przez taką tablicą postawisz gwiazdkę, a konkretnie
nie musi to być tablica, ale cokolwiek co zawiera w sobie iterator, czyli na przykład string
lub nasze inne dowolne obiekty, to w tym momencie robimy coś co nazywa się delegowaniem
generatorów i to wygląda w ten sposób, że teraz kiedy będzie wykonywany
nasz generator, on zrobi yield jeden, ale potem będzie robił yield'y poszczególnych
rzeczy, właśnie z tego obiektu, który będzie tutaj. Nie ważne jak ten obiekt
działa, ważne, że ma iterator i ten iterator coś zwraca i dopiero kiedy zwróci
wszystko, co jest w takim iteratorze, to dopiero później przejdzie dalej. Zauważ,
że teraz wynik to będzie jeden, dwa, trzy, cztery, pięć, a więc
to delegowanie generatorów. Teraz natomiast będę chciał ci pokazać jak takie
delegowanie wykorzystać na przykładzie naszej klasy. Być
może pamiętasz ten kod, który mieliśmy kilka lekcji temu i ja w
tym kodzie ci pokazywałem. Tutaj jest go oczywiście jeszcze więcej. Nie
będę drugi raz tłumaczył, bo już ci to tłumaczyłem, że możemy dodać sobie do naszej klasy
Collection symbol iterator i to sprawiało, że mogliśmy korzystać na przykład z
users, w ten oto sposób i sprawdźmy czy faktycznie to działa. Widzimy
wyniki, takie same jak kilka lekcji temu, ale cały nasz iterator wyglądał
tak, że dodałem go poprzez symbol iterator i tutaj musiałem stworzyć
ręcznie tą metodę next. Natomiast teraz sobie to usunę
w całości i będę chciał stworzyć symbol iterator,
ale żeby on był generatorem, w taki oto sposób i w
środku skorzystamy sobie z delegowania generatorów, czyli jesteśmy
w tym miejscu i co chcielibyśmy tutaj zwracać tym naszym yield'em. Oczywiście
na szybko to można by było zrobić pętle for of, czyli let, na przykład,
model of this models i robić yield model. Wiemy,
że nam by to zadziałało, bo pod this models mieliśmy wszystkie te modele. Sprawdźmy czy ma to sens. Działa
dokładnie tak samo i jest to krótszy zapis, ale skoro możemy delegować generatory,
tak jak ci przy momentem pokazałem. To skoro this models jest to tablica, to co
zróbmy po prostu yield, gwiazdka i this
models. To jest dokładnie to samo co pokazałem ci u góry przed momentem, czyli nasz
yield będzie musiał jakby przelecieć przez wszystko to, co się tam znajduje, a skoro
modele upychałem do zwykłej tablicy, a tablica jest iterable, czyli
ma w sobie iterator, to mogę zrobić generowanie czy delegowanie
generatora w taki oto sposób. Czyli jeden yield wystarczy i właśnie dlatego
ja wcześniej pokazywałem ci jak stworzyć te metody next i tak dalej, żebyś dobrze
zrozumiał czym są iteratory, ale już wtedy mówiłem że wcale nie będziesz musiał robić, bo
takim prostym zapisem dodajemy do naszego własnego typu jakim jest Collection,
możliwość korzystania z pętli for of czy na przykład z operatora spread,
którego zalety już widziałeś. Tyle wystarczy zrobić jeżeli wewnątrz
gdzieś korzystamy z dowolnej rzeczy, która ma w sobie iterator i to może być
string, tablica lub nawet takie rzeczy jak map i set, o których
jeszcze będziemy mówić w tym kursie, więc jeżeli w takich strukturach, gdzieś wewnątrz przechowuje
dane, to żeby dodać sobie do mojej klasy iterator wystarczy
to zrobić w taki sposób, funkcją generatora. Zapiszmy, żeby się upewnić, okazuje
się, że efekt jest cały czas taki sam. Więc polecam praktycznie do większości klas
dodawać sobie iterator, bo zapis będzie bardzo podobny do tego, a dzięki
temu ktoś na obiektach twojej klasy będzie mógł korzystać z operatora spread
czy na przykład z pętli for of.