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 już naprawdę dużo jeżeli chodzi o moduły w ES6. Natomiast w tej lekcji chciałbym
jeszcze garść ciekawostek ci powiedzieć na temat tych modułów, bo
sądzę, że są one bardzo istotne, więc przejdźmy sobie od razu do kodu i mamy
tutaj w katalogu js script, on jest oczywiście podłączony jako moduł, w przeglądarce
i oprócz tego mam jeszcze takie pliki jak objects js, który wygląda tak
i functions, które wygląda w ten sposób i teraz chciałbym wyeksportować
sobie stąd już widzisz, że to zrobiłem, funkcje get value i set value, a value
tutaj będzie taką zmianą prywatną, czyli to zdążyłem już ci powiedzieć w którejś w poprzednich
lekcji, że wszystkie zmienne utworzone tutaj, a nie wyeksportowane nie
będą globalne, czyli z śmiało możesz sobie je tworzyć w modułach. Natomiast jeżeli teraz
sobie ją jak będziemy chcieli zaimportować, w zasadzie nie
tą zmienną, bo nie jest to możliwe, ale funkcje get value i set value, to zróbmy to
sobie tutaj, import get value. Ja preferuję
to w takim zapisie i set value. No i musimy
napisać skąd, czyli from ścieżka tutaj akurat będzie
w tym samym katalogu, czyli będzie to tak wyglądać functions js i
teraz co jest ciekawe, zrobimy sobie console.log get value. Zobaczmy
raz jeszcze co tam się znajduje, czyli get value zwraca nam value, która
jest w tym miejscu, więc powinniśmy zobaczyć 10. Natomiast funkcja set value
nie bez powodu ci to pokazuje, pozwala tę wartość zmieniać, więc zmieńmy ją na 20
i raz jeszcze spróbujmy zrobić sobie get value, czyli zobacz, jeżeli get value
zrobiliśmy, mieliśmy 10, set value na dwadzieścia sprawia, że
tutaj wpada 20 i nadpisujemy tą zmienną, do której ma dostęp z kolei get
value, więc zobaczmy jaki będzie efekt. Jak widzisz możliwe jest zmienienie
tego, co znajduje się w takim module, czyli zmieniliśmy tak naprawdę wartość
zmiennej, która się tutaj znajduje. Teraz pokażę ci kolejny przykład, który
jeszcze bardziej unaoczni ci co ma tutaj miejsce. Mamy taki moduł
jak objects i mam tutaj funkcje create object, która zwraca pusty obiekt
i teraz eksportuje nie tą funkcję, ale zmienną, mogę tak napisać,
czyli tworzę zmienną object z create object, a więc ta funkcja
zwraca pusty obiekt i tak naprawdę eksportuje to pod zmienną
obj, więc spróbujmy to sobie zaimportować w tym miejscu, import
obj, w ten sposób, from
i tutaj ta ścieżka to będzie objects js,
tutaj jeszcze s, ok i zróbmy sobie console.log
obj, no i będzie to jakiś tam pusty obiekt. Natomiast teraz chcę ci pokazać
rzecz ciekawszą. Przejdziemy sobie do functions i w tym functions będę
chciał sobie, może tutaj gdzieś na górze zaimportować też object
from i tak
samo jest to ścieżka objects, czyli
zaimportowałem sobie obiekt i z tego modułu functions chcę go wyeksportować,
czyli export, napiszmy sobie object, w ten sposób i teraz
to oznacza, że wszędzie gdzie będziemy importować functions, mamy też dostęp do tego obiektu,
czyli tutaj gdzie to importowaliśmy, spróbujemy sobie zaimportować jeszcze
obj i teraz dążę do tego, żeby pokazać ci, że te dwa
obiekty będą identyczne, tylko zauważ, że tutaj mamy błąd, dlatego
że nie możemy tych dwóch lokalnych stałych tutaj nazwać tak samo, więc tutaj napiszmy object
2, czyli musimy zaimportować obj as obj
2. To już powinieneś wiedzieć, bo nie może mieć dwóch takich samych nazw, czyli tutaj
lokalne zmienne to będzie obj i obj 2 i teraz za pomocą
object is, metoda, którą już znasz, ona pozwala nam sprawdzić
czy dwie wartości są identyczne, sprawdzimy czy obj równa się obj
2, zobaczmy i mamy wartość true. To jest niesłychanie
ważne, aby rozumieć to w kontekście modułów. Zobaczmy, co tutaj się stało. Importujemy
sobie coś z functions, przejdźmy zatem tutaj. Na początku functions
importuje sobie coś z objects, więc przychodzimy do objects i wywołuje
się tutaj cały ten kod, który widzisz i funkcja create object zwraca nowy
obiekt do tej zmiennej i dzięki temu do functions go tutaj przekazujemy. Natomiast
następnie eksportujemy to sobie i ona się pojawia w tym miejscu, ale
w tym kodzie znowu sobie próbujemy zaimportować objects bezpośrednio z
tego pliku. Wydawałoby się, że ten plik się wykona od nowa i tutaj będzie nowy obiekt. Okazuje
się, że nie, że moduły są zapisywane w pamięci podręcznej, czyli kiedy za pierwszym
razem ten plik się wykonywał, bo functions go sobie importowało, wszystko się
wykonało i została utworzona zmienna object właśnie z obiektem zwróconym z
tej funkcji i teraz kiedy drugi raz sobie wykonaliśmy
ten plik, tak naprawdę importując obj, nie wykonał on się już
od nowa, można powiedzieć, tylko to co tutaj zostało ustawione
wcześniej zostało dla nas zwrócone. Dlatego te dwa obiekty są identyczne, nie dlatego, że
tutaj wyglądają tak samo, bo pamiętaj, że w języku JavaScript, gdybyśmy sobie porównali nawet
poprzez object is, jeden pusty obiekt i drugi pusty obiekt, to
będziemy i false, bo to są dwa różne obiekty chociaż ich zapis jest identyczny. Tutaj
otrzymaliśmy true, a to oznacza, że był to dokładnie ten sam obiekt. Jak
zatem widzisz, wygląda to w ten sposób, że funkcje, które tutaj eksportujemy mogą
mieć dostęp do lokalnych zmiennych, które mogą zmieniać, jeżeli inny jakiś moduł
później to zaimportuje tak jak w przypadku tutaj było value, to ta wartość w tym innym
module będzie zmieniona. Ona nie będzie od nowa tutaj ustawiona na 10, więc chciałbym
ci pokazać na koniec jeszcze jedną rzecz, mianowicie mamy tutaj funkcje get value i
zróbmy tak, że kiedy ją wywołamy, to będę chciał nadpisać get
value inną funkcją, która będzie zwracać powiedzmy value
plus 10. Zróbmy to sobie w ten sposób i tutaj zwrócimy
value i wróćmy do naszego kodu. Nie będę
już używał teraz set value. Zauważ, że sobie zaimportowaliśmy to wszystko i wykonaliśmy
get value, czyli ta funkcja się wykonała i ona w momencie kiedy się wykonała, to nadpisała się
na taką, która będzie zwracać value plus 10, więc jeżeli teraz
drugi raz będę chciał wykonać get value, w zasadzie robiliśmy tutaj u dołu, więc
może tak zostać. Zobacz, będziemy mieli 10 i następnie undefined.
Dlaczego? Zobaczmy. Tutaj zabrakło
słowa return oczywiście, więc raz jeszcze. Mamy 10 i 20
i to pokazuje, że tak naprawdę to co mamy po tej stronie, tutaj,
czyli get value, to jest tylko jakby nazwa, stała taka,
przypisana do jakiejś funkcji, ale jeżeli pod tą funkcją coś tutaj się zmieni, czyli
zostanie to nadpisane, to my również mamy tutaj do tego dostęp. Natomiast gdybym tutaj
próbował nadpisać get value równa się jakaś funkcja,
to zobaczysz, że otrzymamy błąd. Zobacz. Dlatego, że
wszystkie te wartości tutaj importowane, traktowane są jak stałe. Mam
nadzieję zatem, że z tej lekcji zapamiętasz, że moduły są cashe'owane, czyli zapisywane
w pamięci podręcznej. Jeżeli raz taki moduł został już wczytany, to każde kolejne
jego użycie będzie nam już wczytywać ten kod, który tam był, a więc wszystkie
ustawione zmienne również już tam będą. Nie będą to oryginalne
nowe wartości. Podobnie, jak widzisz, możemy mieć funkcję na przykład set value,
którą jeśli wywołamy, to ona potrafi zmienić lokalną zmienną wewnątrz
takiego modułu i teraz gdyby ktoś zainportował ten moduł gdzieś w innym miejscu później, to
ta zmienna będzie już zmieniona, nie będzie to wszystko od nowa tutaj ustawiane.