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.
Kolejną konstrukcją, która doczekała się niewielkich acz jednak dosyć przydatnych
zmian, są literały obiektu. Literałem obiektu jest po prostu obiekt,
który możemy otworzyć w ten sposób, czyli literał, to znaczy, że nie tworzymy
go za pomocą jakieś konstruktora, tylko w ten sposób. Literałem tablicy byłby taki
oto zapis. Zauważ, że tutaj utworzyłem sobie już dwie zmienne. Ja ich nie ograniczam taką
funkcją anonimową. W tym przypadku, żeby trochę ten kod na potrzeby kursu
był czytelniejszy, czasami będziemy to robić czasami nie i chciałbym teraz utworzyć sobie
nowy obiekt, który nazwalibyśmy byśmy person. Będę korzystał tutaj już z tych
nowych słów typu let i chciałbym w tym obiekcie mieć firstName na Jan i lastName
Kowalski. Tutaj definiuje sobie
jak ma się nazywać właściwość i ona nie ma nic wspólnego ze zmiennymi, które są w tym miejscu. Natomiast
te zmienne podstawie sobie tutaj, firstName i lastName
i przypuszczam, że wielokrotnie już widziałeś taki zapis. On chociaż wygląda dziwnie,
to tak naprawdę tutaj definiuje, jak mają nazywać się właściwości tego obiektu,
a tutaj przypisuje im wartości. W tym momencie kopiuje wartości ze zmiennych,
które są wyżej i często taki zapis możemy spotkać, że się tak naprawdę powtarzamy.
No i tutaj specyfikacja ES6 zrobiła nam można
powiedzieć przysługę i pozwala nam to pisać w trochę inny sposób. Czyli jeżeli
miałbyś przykład identyczny jak tutaj, że się musisz po prostu powtarzać, czyli nazwa
właściwości oraz zmiennej, która ma wartość są identyczne,
to możesz je pominąć i napisać to w ten sposób. Wiem, że wygląda
to dziwnie jeżeli jeszcze tego nie widziałeś, ale efekt będzie dokładnie taki sam. Jeżeli
teraz wyświetlimy person w konsoli, zobaczmy firstName Jan i lastName Kowalski.
Gdybyśmy chcieli tutaj do tego obiektu wstawić wyłącznie firstName równa
się firstName, w ten sposób, to można napisać tylko firstName.
Zobacz. Mamy firstName Jan. No i oczywiście w JavaScripcie w
większości przypadków nie ma znaczenia tutaj nowy znak, nowej linii czy
tabulator, więc możemy to zapisać nawet taki sposób bardzo krótki i utworzyliśmy
obiekt, który będzie miał właściwość firstName kierującą na tą wartość, która
jest tutaj. Zobaczmy, efekt jest taki sam. Ja sobie jednak wrócę może do tej
trochę bardziej rozszerzonej wizualnie wartości
czy zapisu. Napiszmy lastName. No i widzisz, że będzie to po prostu tak jak
gdyby firstName dwukropek firstName. No i tak samo z lastName. Efekt jest taki,
jak widać tutaj. Kolejną z ciekawych zmian i jest coś co po
angielsku nazywa się Concise Method, czyli są to takie skrócone metody. W takim
obiekcie przypuszczam, że wielokrotnie tworzyłeś funkcję, pod jakąś właściwością i
wtedy nazywamy ją po prostu metodą. Więc gdybym tutaj napisał getFullName.
Coś takiego, to mogę stworzyć funkcję, która będzie poprzez this miała
dostęp do tego oto obiektu person, czyli gdybym napisał this firstName, to mam
dostęp do tych zmiennych, które są tutaj. Pamiętaj, że w tym starym zapisie one tutaj po
dwukropku były powtórzone, ale już wiemy, że można to skrócić, więc chciałbym po
prostu, żeby tutaj było return firstName spacja oraz this lastName.
No i spróbjemy sobie zrobić w konsoli person
get full name, w ten sposób, oczywiście musimy
tę metodę wywołać. Zrobię trochę miejsca. Zobaczmy
efekt. Jan Kowalski. Natomiast skrócone metody polegają na tym, że można całkowicie
pominąć słowo function oraz dwukropek i zrobić to w taki oto sposób. Ja
przyznam ci się, że często z pośpiechu kiedy nawet jeszcze nie było ES6,
to pisałem sobie coś takiego, co generowało mi błąd, bo zapomniałem dopisać tutaj
słowa function. Teraz będzie to działać dokładnie tak samo. Zobaczmy.
No i widzisz efekt. Jan Kowalski. To co tutaj widzisz
jest to więc tak zwane syntactic sugar, czyli dostajemy coś co zapisuje
się inaczej, ale działa to dokładnie tak samo jak gdybyśmy to zapisali w tej dłuższej
formie i teraz pokażę ci jeszcze jedną kapitalną rzecz, która
pozwala nam tworzyć prosto w literale obiektu dynamiczne właściwości. Na
czym to polega? Wyobraźmy sobie, że tej metody getFullName tutaj nie ma i chciałbym ją dodać
poza tym obiektem albo innymi słowy niekoniecznie poza obiektem, ale jej nazwa
byłaby dynamiczna, czyli napisałbym sobie na przykład fn name i byłby
to string getFullName. Jak taki string,
mając go w zmiennej z jakiegokolwiek powodu, po prostu być może dynamicznie bym go
tutaj jakoś określał, może byłaby to funkcja, która miałaby na końcu 1, następna miałaby
2 i tak dalej. Jak z takiego string'u przypisać funkcję? Nie
dało się tego zrobić w ES5 tutaj bezpośrednio, bo gdybym napisał fn
name, no to wiadomo, że utworzyłbym tutaj metodę czy właściwość,
która tak by się nazywała, a nie tak jak jest tutaj. Dlatego musimy poza obiektem w ES5
napisać person i następnie wiesz, że do właściwości obiektu można
się odwoływać po kropce jeśli znamy ich nazwy lub możemy w taki sposób tutaj
podać string. No i mógłbym się odwołać na przykład do firstName. Skoro tutaj mogę
podać string, to podam to, co przechowuje fnName, tutaj u góry fnName i
dopiero do tego przepisze funkcję. Gdybym to zrobił w ten sposób i
ta funkcja miałaby taki return, to po wywołaniu tego kodu efekt
będzie taki sam. Natomiast mamy teraz nową możliwość, która pozwala nam
przypisywać takie dynamiczne metody i właściwości bezpośrednio w literale
obiektu. Zobaczmy zatem jak by to wyglądało. Ten kod sobie wykomentuje. Wrócę
do tego kodu i w miejscu gdzie mam to getFullName zrobię sobie
takie nawiasy jakby to była tablica, ale nie ma to nic z tablicą wspólnego
i tutaj wpiszę fnName. W ten sposób, w tym miejscu zostanie
to wyrażenie JavaScript'owe wyliczone i zostanie podstawiony getFullName.
Zobaczymy czy efekt jest znowu taki sam. No i okazuje się, że tak. W
ten sposób możesz tworzyć nie tylko takie skrócone metody, ale każdą inną właściwość
moglibyśmy tutaj napisać, na przykład fnName i do tego nawet sobie coś
dodać. Każdy kod JavaScript, taki wyrażeniowy był tutaj działał. Mógłbyś jakąś funkcję
wywołać i to co ona zwraca byłoby tutaj podstawione, więc mamy getFullName
i powiedzmy, napiszmy tutaj jeden i chciałbym do tego przypisać
string Witaj. Wiem, że to bez sensu, ale zobaczmy. Jeśli
teraz napiszę person getFullName 1, to
będę miał tutaj Witaj. Widzisz zatem, że można tworzyć dynamicznie wewnątrz
takiego literału obiektu właściwości i dowolne wyrażenie tutaj
będzie działać. Podobnie można tworzyć te skrócone metody. Oczywiście
tutaj mogła to być normalna metoda zapisana w ten sposób. Powinno to zadziałać tak samo. Jak
widzisz tak też działa, natomiast słowo function nie jest tutaj już po prostu potrzebne.
Jak zatem widzisz dostaliśmy kilka może niewielkich, ale bardzo przydatnych
usprawnień do obiektów, czyli po pierwsze, możemy tutaj się nie powtarzać jeżeli właściwość
oraz nazwę zmiennej, która by tutaj była są takie same, także dostaliśmy
możliwość tworzenia skróconych metod bez słowa function i dodatkowo możemy
dynamicznie tworzyć właściwości i metody takiego obiektu na podstawie
dowolnego wyrażenia JavaScript.