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.
Język JavaScript w wersji ES6 doczekał się wreszcie zapisu
klas. Natomiast już na początku tej lekcji chciałbym cię uprzedzić, że jeżeli wcześniej korzystałeś
z klas w innych językach programowania, takich jak na przykład język PHP, to
to, co za moment zobaczysz, chociaż wygląda podobnie, to tak naprawdę wciąż działa tak
samo jak działało wcześniej w języku JavaScript, z niewielkimi subtelnymi różnicami,
które jednak i wcześniej można było odwzorować. Tak więc, jeżeli
wiesz jak działają prototypy w języku JavaScript, to dokładnie
zrozumiesz za moment w jaki sposób działają klasy, bo wciąż opiera się to te same mechanizmy
dziedziczenia prototypowego. Otrzymaliśmy zatem tak
zwany syntactic sugar, czyli nowy ładniejszy zapis. On jest bardziej czytelny,
ale jednak wciąż działa w taki sposób jak w przypadku EcmaScript 5. Przejdźmy
sobie zatem do kodu i na sam początek będę chciał ci przypomnieć, jak to wyglądało
w EcmaScript 5, czyli jak mogliśmy stworzyć coś, co można byłoby teoretycznie
nazwać klasą. Nazywaliśmy to w języku JavaScript funkcją konstruującą lub konstruktorem,
ale za jego pomocą można było otworzyć nowe obiekty, czyli nowe instancje,
klasy, tak powiedzielibyśmy o tym w innych językach programowania. Posłużymy
się klasycznym przykładem klasy person dlatego, że naprawdę na nim dobrze
jest obrazować o co chodzi, a nie jest ona zbyt skomplikowana, więc w ES5
stworzylibyśmy, wydawałoby się zwykłą funkcję, którą nazwałbył person.
Oczywiście jeszcze tutaj przejdźmy sobie do odpowiedniego przykładu, czyli do examples
i tutaj 21 start js, okej i teraz
napiszemy sobie Person i byłaby to funkcja konstruująca. Chciałbym,
żeby przyjmowała pierwsze imię i nazwisko, więc w
ten sposób sobie to zróbmy i teraz w obiekcie będziemy chcieli to zapisać, więc to co
teraz piszę, mam nadzieję, że nie jest to dla ciebie nowością, dlatego że aby
zrozumieć klasy w ES6, to musisz rozumieć to, co robię teraz tutaj
dlatego bardzo skrupulatnie nie będę tego tłumaczył. Jeżeli sobie utworzyliśmy
taką funkcję i wywołaliśmy ją później tworząc na przykład jakąś
zmienną, z użyciem słowa kluczowego new, to
możemy tutaj oczywiście przekazać parametry. Na przykład Jan Kowalski, ale
jeżeli użyjemy słowa kluczowego new, to zostanie utworzony nowy obiekt,
do którego zostaną przypisane takie właściwości, czyli firstName i lastName, a
więc this kieruje na takim nowy utworzony obiekt, do którego to przy piszemy
i zostanie zwrócony tutaj do zmiennej person. Teraz gdybyśmy
chcieli dodać metodę do tej klasy, w taki sposób, aby na
person1 można było z nich korzystać, to odwoływaliśmy się do person kropka
prototype, dlatego że każda funkcja w języku
JavaScript przynajmniej wersji ES5 ma prototyp, czyli możemy się do
tego odwołać. Jest to obiekt, więc możemy do niego dodać jakąś właściwość. Napiszemy sayHello
i pod tym chciałbym, żeby znajdowała się funkcja i teraz ta funkcja ma dostęp this i ten this
będzie obiekt, na którym wywołamy sobie taką metodę,
czyli jest to dynamiczne, dlatego chciałbym z takiej funkcji zwrócić coś takiego
this firstName. Do tego sobie dodamy pustą
taką spację i this lastName. No i teraz na końcu w console.log'u będę
chciał napisać person1 sayHello. Zaraz ten przykład przepiszemy
sobie na ES6. Natomiast na razie chciałem ci to pokazać w EcmaScript 5. Okej,
no i w konsoli jeżeli sobie ją otworzymy, powinniśmy zobaczyć Jan Kowalski, czyli
tak w EcmaScript 5 można było otworzyć klasy. Tworzyliśmy funkcję, w której
korzystaliśmy ze słowa this i następnie dodawaliśmy na prototypie jakieś metody
i później tworzyliśmy nowe obiekty z tej funkcji za pomocą słowa kluczowego new. Jak
zatem taki zapis wyglądałby w przypadku klas EcmaScript 6. Wykomentuje
go sobie, żebyśmy nie mieć błędu i będę chciał ci teraz pokazać jak to zrobić.
Otóż mamy nowe słowo kluczowe klas, po którym możemy napisać nazwę
klasy, nie musi ona być z wielkiej litery, ale taka jest przyjęta konwencja, dlatego
tutaj również zrobiłem to w ten sposób i teraz otwieramy sobie takie oto nawiasy.
Zauważ, że tutaj nie stawiamy takich nawiasów okrągłych, tylko
robimy sobie coś takiego i wewnątrz tworzymy metodę o nazwie konstruktor
i dopiero tutaj otwieramy sobie takie nawiasy. Jest to
funkcja i zauważ, że tutaj korzystamy również takiego zapisu skróconej funkcji,
jakie pokazywałem ci już przypadku literałów obiektów. Natomiast tutaj nie można tego zapisać
inaczej, więc nie mogę napisać tego w ten sposób, bo mielibyśmy błąd,
co zresztą można zobaczyć w moim edytorze. Czyli zawsze będziemy tworzyć metody
w taki oto sposób i konstruktor jest taka specjalna metodą. Ona ma zawsze
taką nazwę i będzie to jakby dokładnie ta funkcja, którą mieliśmy
tutaj bezpośrednio, czyli kiedy wywołuje sobie new person i podaje te
parametry, to tutaj one wpadały bezpośrednio jakby do tej funkcji. Natomiast w przypadku
klasy, one będą wpadały tutaj, do funkcji constructor. Dlatego mogę je
sobie tutaj przyjąć i wewnątrz mogę zrobić dokładnie
to samo, co zrobiłem wyżej, więc zrobimy sobie taki zapis, okej i
w ten sposób również utworzymy poprawny obiekt. Z tym,
że nie mamy na jego prototypie jeszcze metody sayHello, więc wykomentujemy to i zobaczymy.
Nie ma żadnego błędu gdybym się odwołał do person1. Zobacz, mamy wewnątrz
Jan Kowalski, czyli na razie wszystko działa i ten zapis wydaje mi się, że
jest bardziej elegancki. Teraz próbujemy sobie dodać metodę do prototypu i mógłbyś
zapytać czy można dodać metodę to person prototyp, w ten
sposób. Czyli to, co zrobiłem wyżej, okazuje się, że tak i pytanie brzmi dlaczego.
Otóż czym jest klasa? Gdybyśmy sobie wykomentowali to co mieliśmy tutaj,
to na moment zakomentujemy. Zapisze i w przeglądarce napiszę typeof
Person. Zobacz, że mamy tutaj zwracane, zwrócone
function. To oznacza, że to jest funkcja, więc
wszystko na razie jest okej. Natomiast czym jest klasa? Jeżeli teraz zrobimy typeof person. Okazuje
się, że również jest to funkcja i to jest to, o czym mówiłem wcześniej, że mamy tutaj do czynienia z tak
zwanym syntactic sugar, czyli to wygląda ładnie i można to zapisać
inaczej, ale wciąż działa tak samo i z tego powodu funkcja person
też będzie miała prototyp i możemy na tym prototypie coś dodać. Jednak
zapis klas pozwala nam dodawać metody w nieco inny sposób. Otóż
tutaj wewnątrz tej klasy nie stawiamy tutaj przecinka, tak jak w obiekcie. Normalnie
robimy sobie miejsce i możemy wstawić metodę od razu, czyli na przykład sayHello.
Znowu jest to skrócony zapis i ta metoda zostanie dodana na
prototypie, a więc oczywiście nie będzie tworzona za każdym razem kiedy utworzymy nowy
obiekt, tylko będzie ona jednorazowo utworzona na prototypie i będziemy
mogli do niej się odwoływać później w taki sposób jak tutaj, więc to odkomentuje,
a tutaj sobie uzupełnię tę metodę, skopiujemy sobie ten zapis, ale
że jesteśmy w ES6, to zamieńmy go sobie na taki
oto zapis, który już poznałaś, czyli template string, okej. Oczywiście
tutaj wyżej również mogłem napisać template string, bo wykonujemy to w przeglądarce Chrome, która
to wspiera, ale chciałem pokazać jak to wyglądało w przypadku tworzenia tych konstruktorów w ES5,
więc i ten zapis tutaj zrobiłem taki w starszym stylu. Zobaczmy
czy nam się wyświetli w konsoli Jan Kowalski. Oczywiście tak. Teraz
powiem ci jeszcze o kilku rzeczach, które są istotne w przypadku tworzenia klas i jakie są różnice
pomiędzy funkcjami. Funkcje po pierwsze są hoistowane, czyli jeżeli
miałbym tę funkcję, ja już nie będę ją uruchamiał, ale chcę ci tylko powiedzieć o co chodzi,
miałbym ją w tym miejscu, a tutaj u góry chciałbym zrobić new Person, zakładając,
że tej klasy nie ma, to nie będę miał błędów, bo funkcja jest hoistowana, czyli wynoszona na górę
zakresu. Z klasami tak nie będzie, czyli klasy nie są hoistowane, a to
oznacza, że nie mogę użyć klasy zanim
nie została zdefiniowana, czyli tutaj new Person mogę użyć, tylko dlatego że wcześniej mamy
klasę Person. Kolejna rzecz jest taka, że tutaj zauważ, nie ograniczyłem
żadną funkcją tego zakresu, więc person jest widoczne globalnie. Mogę napisać person
i zostanie mi zwrócona klasa. Natomiast klasy, podobnie
jak w przypadku tworzenia zmiennych czy stałych z użyciem let i const, nie
są dodawane do window, czyli gdybym napisał window i tutaj person, to
będziemy mieli undefined. Gdybym jednak odkomentował tę funkcje tutaj, to
mielibyśmy window kropka person i zwracałoby to tą funkcję, czyli klasy też
nie są dodawane jako właściwości obiektu window i jeszcze
jedna ciekawostka. Taką funkcję jak mieliśmy tutaj u góry można byłoby wywołać bez słowa
new i z tym wiążą się różne problemy, które mam nadzieję znasz. To przede
wszystkim wtedy this nie będzie kierować na nowo utworzony obiekt, ale na obiekt globalny
na przykład na window i dodalibyśmy do window takie dwie oto właściwości.
Natomiast w przypadku klasy, nie ma możliwości nieużycia słowa new, czyli
jeżeli tutaj usunę new, zobacz, to będziemy mieli błąd o takiej
treści, czyli to jest tutaj już bardziej przydatne dla nas. Lepiej
się z tym pracuje, bo nie możemy to zapomnieć o słowie new. Zawsze musimy
z niego skorzystać i to by było tyle w tej lekcji jeżeli chodzi o wstęp do klas. Od
kolejnej lekcji będziemy to oczywiście kontynuować. Możesz się tutaj na moment zatrzymać sprawdzić
sobie w przeglądarce co kryje się pod person kropka prototype, czy faktycznie wygląda to
podobnie do tego starego zapisu. Zapewniam cię, że tak, ale polecam ci
abyś sobie po eksperymentował. Jak zatem widzisz mamy nowy czystszy zapis,
który w gruncie rzeczy działa prawie tak samo, oprócz kilku różnic takich jak
na przykład to, że musimy skorzystać ze słowa kluczowego new czy, że na przykład klasy
nie są hoistowane i nie są dodawane jako właściwości globalnego obiektu. Tych
różnic jeszcze kilka, ale o nich powiemy sobie w lekcji o ciekawostkach na
temat klas.