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, że mamy kilka metod dostępnych dla symboli
i zaczniemy sobie od takiego przykładu, bardzo podobnego jak mieliśmy do tej pory. Tworze nowy symbol,
który sobie przechowuje pod stałą hidden i pod tym symbolem
zapisuje jakiś losowy ciąg i teraz do mojego obiektu person
dodałem jeszcze metody, które może ten ciąg zwrócić. Pamiętaj, że w 100% on nie
jest prywatny, zaraz zresztą to zobaczysz, ale nie jest możliwe
nadpisanie go, czyli dzięki temu mamy pewność, że ktoś to będzie operował na moim obiekcie person. Na
pewno mi tego symbolu nie nadpiszę, bo nawet jak utworzy nowy, poprzez dokładnie
taki sam zapis, to nie będzie to taki sam symbol i tutaj poprzez this hidden,
czyli podanie dokładnie tej stałej mogę zwrócić, więc odwołajmy się
tutaj do person i następnie do getSecret. On
zostanie zwrócony. Natomiast teraz pokażę ci metodę, która pozwala
nam tworzyć symbole i przechowywać je jakby w takim normalnym zakresie. W lekcji poprzedniej
ci powiedziałem, że kiedy będziemy pracować z modułami i utworzyli byśmy sobie taki symbol,
tak jak tutaj. No to wiadomo, jest to stała, więc jest to widoczne tylko w zakresie, w którym
aktualnie jesteśmy, gdybym tutaj miał jakąś funkcję, nad tym wszystkim, to tylko tam
byłoby to widoczne. Natomiast można utworzyć symbol, który będzie przechowywany w takim
specjalnym globalnym rejestrze, a więc w dowolnym innym miejscu w kodzie,
nawet innych modułach, będzie można się do tego symbolu odwołać, więc
żeby utworzyć taki symbol to nie korzystamy z takiej funkcji symbol,
ale napisałbym const hidden równa się symbol for
i tu bym napisał hidden. Na razie będzie to działać dokładnie tak samo, ale
to sprawi, że będzie ten symbol przechowywany w takim jakby globalnym rejestrze. Zobaczmy,
efekt jest ten sam, ale teraz za każdym razem kiedy odwołamy się to symbol for,
to będziemy mogli pobrać ten string i zwrócić taki symbol, czyli
teraz gdyby ktoś się do niego odwołał, na przykład w tym miejscu, powiedzmy,
że nie mamy dostępu do tej zmiennej hidden, bo to zostało utworzone w zupełnie innym zakresie. Jest
taka możliwość i w zasadzie zróbmy sobie to może funkcji anonimowej. Ta funkcja
się wykona od razu i utworze taki symbol, nawet nie będziemy mieli dostępu do
tej zmiennej hidden, ale będziemy mieli do niego dostęp poprzez symbol
for hidden, czyli ta metoda działa tak, że ona jeżeli jej przekażesz tutaj
string i ona sobie sprawdzi, że jeszcze nie był taki symbol utworzony, to utworzy
pod takim kluczem symbol, zapisz go w globalnym rejestrze. Natomiast każde
kolejne użycie symbol for, w taki sposób, będzie zwracać
ten właśnie symbol. Sprawdzimy czy ma to sens i czy nam to zadziała, hidden
is not defined. Acha, tutaj jeszcze musimy sobie to zrobić w ten sposób, okej.
I teraz getSecret. Jak widzisz, dokładnie tak jest, więc jeżeli chciałbyś
sobie tworzyć symbole, które będą przechowywane gdzieś w globalnym rejestrze,
to możesz to zrobić ten sposóbm a pod tymi symbolami można przechowywać różnego rodzaju
stałe, bo nie da się ich zmienić, nie da się ich nadpisać i wiem, że one będą na
pewno, tak jak tutaj widzisz, indywidualny, czyli unikalny
za każdym razem. Ja sobie jednak wrócę do wcześniejszego zapisu,
bo nam się to po prostu tutaj przyda, czyli
chciałbym mieć znowu zmienną hidden, czystą
hidden. Tutaj możemy z tego skorzystać w dowolny sposób, ale
za moment nam się to przyda niżej. Na razie będzie to działać cały czas tak samo. Myślę, że już
zobaczyłeś jak działa ta metoda. Mamy natomiast jeszcze inną metodę, która
pozwoli nam pobrać klucz, gdyby to było z jakiegoś powodu przydatne. Mi szczerze mówiąc
się to jeszcze nie przydało, ale jeżeli mamy odwołanie do symbolu, mamy
gdzieś przekazaną do funkcji czy z jakiegokolwiek innego miejsca, zmienną, w której jest przechowywany jakiś
symbol, a chcielibyśmy zobaczyć jaki on miał podany klucz przy tworzeniu, czyli
właśnie ten string, to możemy się odwołać do Symbol keyFor
i przekazać tutaj ten symbol, czyli w tym przypadku mamy go pod stałą hidden. Mam
do niej dostęp i zobaczymy, że będzie to po prostu string hidden, czyli zostało
dla mnie zwrócone to, co przy tworzeniu takiego symbolu ktoś podał. Na
koniec pokażę ci jeszcze dwie metody. Ja wkleję może najpierw pierwszą z nich. Mamy w ES
taką metodę, jak Object getOnPropertyNames, czyli możemy
sobie z dowolnego obiektu, który tutaj przekażemy zwrócić tablice, w której będą wszystkie
właściwości takiego obiektu. Zobaczmy, co zostanie zwrócone, widzimy
tylko getSecret. To pokazuje, że podobnie jak pętla for in, tak
samo getOnPropertyNames nie widzi symboli do danych w ten sposób. Nie znaczy
to, że to jest wszystko prywatne, ale one nie są zazwyczaj widoczne. Natomiast
gdybyś chciał z dowolnego obiektu pobrać sobie wszystkie symbole, które w nim są, to
możesz skorzystać z funkcji, która się nazywa i jest teraz w ES6 dostępna, getOnPropertySymbols
i tym razem ona nam zwróci symbole. Jak widzisz, tablica symboli. Chociaż
to wygląda jak strng jest to normalny symbol, czyli gdybym sobie to
odwołanie zapisał w jakiejś zmiennej, to mogłbym potem na tej zmiennej odwołać
się na przykład do 0 i miałbym dostęp dokładnie tego symbolu, czyli
to sprawia, że rzeczy dodane do obiektów nie są prywatne
w 100% z tego powodu, że zawsze na obiekcie mogę wywołać getOnPropertySymbols i
pobrać sobie wszystkie symbole, a kiedy już je mam, to mogę za ich pomocą wgryźć
się do obiektu. Jak zatem widzisz, w taki sposób to wygląda. Zobaczyłeś
zatem już, jak tworzyć symbole i jakie są do nich metody i być może cały czas zastanawiasz
się czy w ogóle kiedykolwiek będziesz z tego korzystał. Zapewniam cię, że z czasem tak, szczególnie
w takich przypadkach jak pokazałam ci wcześniej na klasach, gdzie można zasymulować swego
rodzaju prywatność. Natomiast symbole najbardziej przydają się, kiedy korzystamy z tak
zwanych well-known symbols, czyli symboli wbudowanych, która oferuje nam
już język JavaScript i tym zajmiemy się w lekcji kolejnej.