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.
Do języka JavaScript w wersji ES6 został dodany nowy typ
prymitywny, czyli symbole. Wcześniej mieliśmy kilka typów prymitywnych i był
to na przykład number, boolean, string czy powiedzmy undefined
i null. Natomiast teraz mamy jeszcze kolejny typy prymitywne jakim jest
symbol i teraz, jak to wygląda i do czego służy, już będę chciał ci pokazać.
Od razu sobie przejdziemy do kodu i będę chciał utworzyć stałą
o nazwie hidden i tutaj wywołam sobie symbol, w taki oto sposób. Mamy
funkcje symbol, której możemy przekazać string, ale nie musimy. Jeżeli
przekażemy, to potem będziemy mogli za pomocą tego string'u na przykład sobie zdebug'ować, o
który symbol chodzi, więc może sobie go podajmy i ja napiszę ściśle tajne
i teraz
będę chciał ci w konsoli pokazać co znajduje się pod hidden, czyli co nam zwróciło symbol.
Przejdźmy sobie tutaj i napisz mi hidden. Okaże się, że taka
reprezentacja została zwrócona, czyli symbol i ten string, który podałem. Ale jeżeli skorzystamy
z operatora typeof na hidden, to zostanie zwrócone
symbol i to nam mówi, że jest to nowy typ prymitywny, taki jak na przykład number czy
string i teraz do czego są symbole i co one robią. Otóż wywołanie
symbol, nieważne co mu tutaj przekażemy, nawet gdybym drugi raz sobie zrobił
coś takiego, zwróci nam można powiedzieć unikalny obiekt,
ale nie jest to obiekt, bo jest to typ prymitywny i najlepsze w tym jest to, że my nie
możemy sprawdzić co on tak naprawdę zwraca i czym jest ta wartość. Natomiast mamy stuprocentową
pewność, że ta wartość za każdym razem będzie unikalna. Nawet jeżeli dwa razy
wpiszę ten sam string, pamiętaj, że on służy głównie do debugowania, żeby sprawdzić czego
dotyczy dany symbol, czyli symbol jest to jakaś wartość
nie wiemy jaka, ale wiemy że ona na pewno jest unikalna, czyli pod hidden i hidden2
mam teraz dwie unikalne wartości i coś mogę z nimi zrobić. No i teraz
dobre pytanie, co będziemy chcieli z nimi zrobić. Jedną z nich usunę i
utworze sobie teraz obiekt Person. Za moment zobaczysz,
jak wszystko zaczyna nam się łączyć w pewną całość, czyli te rzeczy, które poznałeś do tej pory.
Chciałbym w tym obiekcie utworzyć sobie, można powiedzieć właściwość, której
nikt nie będzie widział. Gdybym napisał hidden i tutaj bym sobie napisał jakiś taki string,
powiedzmy służący do szyfrowania czegoś, niech on wygląda w taki sposób. To
co by to oznaczało. Oznaczałoby tylko tyle, to hidden
nie ma nic wspólnego z tym, że mogę sobie w konsoli zobaczyć pod
Person, oczywiście hidden. Natomiast chciałbym sobie dodać właściwość, która nie będzie
widoczna, przynajmniej na pierwszy rzut oka i pamiętasz, że mogliśmy
sobie dodawać wyliczone właściwości i robiło się to w taki sposób, że tutaj stawialiśmy
zapis taki jakby tablicowy i tutaj mogliśmy sobie wpisać na przykład jakiś string,
do którego można było coś dodać i tak dalej i w tym miejscu można podstawić
symbol. Wciąż nie wiemy jaką wartością jest symbol, co to w ogóle jest. I tego
się nie dowiemy, ale możemy jako symbol wstawić go tutaj do
takiej wyliczonej właściwości, i to sprawi, że jeżeli teraz zapisze i podejrzymy sobie
person, to będziemy mieli object, gdzie mamy symbol ściśle tajne,
ale on chociaż tutaj jest widoczny, to nie będzie widoczny przy, na przykład,
pętli for in. Nie pokazałem ci przed momentem tej pętli for in, ale teraz
gdybyśmy sobie ją zrobili, na przykład, key in Person,
console.log, to zobaczysz, że
nic nam się nie pojawi dlatego, że symbol jest jakby ukryty. To nie
sprawia, że możemy zrobić jakąś prywatną w stu procentach właściwość, co przed momentem widziałeś
dlatego, że w lekcji kolejnej zobaczysz metody, które służą do wyszukiwania symboli
w jakichś obiektach. Natomiast symbol, to jest jakaś unikalna wartość, która pozwoli
nam w ten sposób coś można powiedzieć nawet nie tyle ukryć, co
zapisać wewnątrz. Tylko teraz pytanie brzmi jak mogę się do tego string'u
odwołać i mogę się do niego odwołać wyłącznie mając referencje do
tego co mi zwrócił symbol, czyli gdybym teraz chciał sobie tutaj wyświetlić
ten hidden musiałbym napisać console.log person i przekazać
dokładnie to, co mam pod zmienną hidden, czyli jest to jakaś wartość, którą jeśli tutaj przekażę,
to zostanie mi zwrócony ten ciąg. Zobaczmy, tak też się stało
i wiem, że na początku wydaje się, że jest to coś co jest mało potrzebne,
ale za moment zobaczysz jeszcze bardziej praktyczne tego przykłady. Stworzymy
sobie teraz przykład z klasą. Wkleje sobie klasę, którą już
kilkukrotnie widzieliśmy. Okej,
mamy jakiś konstruktor i mamy metodę sayHello i teraz pytanie brzmi, gdybyśmy
chcieli wydać sobie do klasy jakieś metody prywatne, czyli takie, które nie będą
widoczne na obiekcie, który utworzymy. Gdybym teraz utworzył person1 new Person
i podał Jan Kowalski. W konsoli
byśmy sobie zrobili person1 sayHello. Wszystko
jest okej, natomiast gdybym chciał tutaj utworzyć metodę prywatną wciąż JavaScript nam na to
nie pozwala, czyli taką do której person1 kropka nie miałoby
dostępu. To jak możemy to zrobić. W stu procentach takiej prywatności tutaj
nie uzyskamy, ale moglibyśmy sobie utworzyć symbol z użyciem const i
też odpowiem ci na pytanie dlaczego skorzystałem z const. Dlatego, że
mam stuprocentową pewność, że nikt mi tej wartości nie nadpiszę, bo const na to nie pozwala,
a więc zawsze będę miał na niej dostęp, ale utworzmy sobie z użyciem const
symbol, któremu jako string podam tutaj
na przykład format. Mogę podać co chcę, więc podam sobie, że jest to metoda format
i oczywiście muszę tutaj nadać nazwę. Z wielkich liter może sobie napiszę
format i teraz okazuje się, że w klasach też możemy korzystać z wyliczonych
właściwości, a więc podobnie jak w obiektach i w klasach możemy właściwość
nazwać sobie za pomocą dynamicznej na przykład jakieś zmiennej. Czyli znowu mógłbym
tutaj wpisać jakiś string czy podstawić jakąś zmienną. Podstawie sobie symbol
format, w ten sposób i sprawie,
że będzie to metoda, w taki oto sposób i chciałbym, żeby ta metoda przyjmowała
sobie na przykład jakiś string tekst i żeby zamieniała go na wielkie
litery, czyli return textToUppercase. No i ja chcę,
żeby ona była prywatna, a to oznacza, że kiedy odwołam się do person kropka to
żebym nie mógł się tutaj odwołać do tej metody i teraz
z niej będę chciał skorzystać tutaj. Ona została podana na prototypie i tutaj
mogę się poprzez this do niej odwołać, ale właśnie, muszę mieć odwołanie do symbolu,
czyli muszę napisać this format, wywołać ją przekazując
jej cały ten string. Zobaczmy czy nam to zadziała. Jak
widzisz mamy z wielkich liter Jan Kowalski, czyli teoretycznie utworzyliśmy sobie metodę prywatną.
W tym akurat konkretnym przypadku, gdzie wszystko mamy w jednym pliku, to
mógłbym na person1 do niej się odwołać, bo mógłbym sobie napisać coś takiego jak
na przykład person1. Podałbym ten symbol,
czyli format i miałbym dostęp do tej metody. Natomiast
normalnie ja do tego symbolu nie będę miał dostępu, w tym kursie jeszcze dowiesz się czym są
moduły w ES6 i wyobraź sobie na szybko, że to co tutaj widzisz
do tego momentu do tej linii, czyli tylko to, to będzie w
jakimś jednym pliku w jednym module, więc utworzymy sobie format, taki oto
symbol i wewnątrz te metody tej klasy będą miały do niego dostęp, a więc
dzięki niemu również to takie metody prywatnej i teraz
na końcu takiego modułu, co jeszcze w tym kursie zobaczysz, można taką klasę wyeksportować
i można ją później, to wyglądało by tak, powiedzmy i w innej,
w innym module można ją zaimportować i dopiero w innym module gdzie ją importujemy, za
jej pomocą tworzylibyśmy byśmy new Person, czyli w zupełnie innym module. Ja nie będę miał
odwołania do tej stałej, a więc nie mógłbym napisać tego co pokazałem przed momentem, czyli person1,
format. W ten sposób stworzyliśmy sobie swego rodzaju prywatność, bo
tylko jakby ta klasa ma dostęp do tej stałej, bo
jest zdefiniowana w tym samym zakresie. Tak jak wspomniałem musiałoby to być osobnych modułach.
W tej lekcji zatem to już wszystko. Zobaczyłeś jak utworzyć symbol i
zapamiętaj tyle, że każdy nowo utworzony symbol zawsze będzie w stu procentach indywidualny,
czyli jeżeli dodamy sobie do jakiegoś obiektu coś pod symbolem, nawet jeżeli to nie jest ukryte. Co
prawda nie pojawia się w pętli na przykład for in, nie jest ukryte, ale nikt nam tego nie nadpisze,
bo gdybyśmy chcieli zasymulować symbol, to teoretycznie moglibyśmy tutaj napisać
jakieś całkowicie randomowe rzeczy i pod tym sobie to przepisać, też
działałoby nam tak samo, ale ktoś teoretycznie przez przypadek do naszego obiektu, mógłby
dodać sobie również dokładnie takie same rzeczy i nam to nadpisać. Natomiast
nie może tego zrobić jeżeli korzystamy w symbolu, dlatego może wrócę tutaj
do tego zapisu i w ten sposób to pozostawie. W przypadku klas, jak widzisz, jest
to już nieco bardziej przydatne, bo stworzyłem metody, które nie będą widoczne na obiekcie
na przykład person1, bo musielibyśmy mieć dostęp do symbolu.