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 do naszej biblioteki dodamy sobie główną klasę oraz kilka metod pomocniczych
więc przejdźmy sobie od razu do kodu w folderze 69 mamy to na czym
skończyliśmy w lekcji poprzedniej z tym że tutaj w main pousuwałem już te
console logi i mamy tutaj od razu odwołania do tych funkcji więc na
przykład find element czy create element będą nam tutaj generowały błąd bo
nie istnieją dlatego chciałbym je teraz dodać tutaj w katalogu utils chciałbym
utworzyć moduł element js więc przejdźmy sobie do examples 69
start js utils i tutaj napiszemy sobie element
js ok tutaj chciałbym sobie wstawić kilka funkcji
które będziemy sobie mogli wyeksportować więc znowu ja je tutaj po
prostu wkleję i zaraz je wytłumaczę ale najpierw sobie je
zaimportujemy w tym oto głównym pliku więc napiszmy import i chciałbym
zaimportować najpierw metodę find element a po
drugie metodę create element from i tutaj
address to będzie utils element js czyli te
funkcje teraz już tutaj będą i powinno być okej zobaczmy czy mamy jakiś błąd okej
tutaj pewnie brakuje jeszcze s find elements zobaczmy czy o to chodziło
tak teraz nie ma już błędu więc wszystko zaczyna się układać w całość
natomiast zobaczmy co miałem tutaj na myśli jeżeli mamy pierwszy warunek czyli
is selector a więc w naszym pliku test dodaliśmy na przykład li to chcę
na stronie wyszukać wszystkich elementów li z użyciem document query selector all dlatego
ta funkcja find elements otrzyma ten selector i będzie nam chciała
to wyszukać i zwrócić w formie tablicy czyli query selector all zwraca
node list a jest to taki obiekt tablicopodobny a ja chcę żeby to była tablica dlatego
korzystam z metody array from czyli z nowej metody dostępnej w ecmascript 6 którą
w tym kursie poznałeś i to mi obiekt tablicopodobny zamienia na tablicę
i teraz o co chodzi jeżeli na przykład mieliśmy ten transform runtime pamiętasz
ja mówiłem że z metod na prototypie wtedy nie powinniśmy korzystać jeżeli chcemy to
przetranspilować ale z metod statycznych takich jak tutaj na przykład na array
możemy i transform runtime bez problemu sobie z tym radzi czyli
w tym przypadku jeżeli tutaj przejdziemy to pod nodes będę miał to co zwróci
find elements czyli właśnie opakowany w array document query
selector all selector czyli na stronie w obiektowym modelu dokumentu wyszuka nam
wszystkich tych elementów natomiast jeżeli byśmy sobie tutaj podali to
w inny sposób czyli coś takiego wiemy już że wykona się nasz warunek is
html tag i do nodes chcę zapisać to co zwróci create element
create element będzie robiło takie wyrażenie regularne gdzie
wyszukujemy sobie wszystkiego co jest pomiędzy tymi dziubkami czyli w przypadku
li będę chciał znaleźć te elementy które są w środku czyli li i
za pomocą exec to mi zwróci tablicę możemy
tutaj sobie zrobić console log result abym mógł ci to pokazać odświeżmy
tutaj jeszcze musimy w tym test zapisać i taka
tablica zostaje zwrócona z tego exec gdzie jak widzisz pod drugim indeksem
czyli 0 jest 1 tak naprawdę jest indeks numer jeden mamy słowo
li takie słowo możemy przekazać do document create element przekazując li
jest to też natywna funkcja w obiektowym modelu dokumentu dlatego właśnie
będę sobie to mógł sprawdzić w ten sposób jeżeli pod result jest tablica a
nie zostało zwrócone null bo może zostać zwrócone null jeżeli
w tej tablicy jest coś pod indeksem pierwszym tak jak przed momentem ci pokazałem to
chcę zwrócić document create element i przekazać mu ten pierwszy indeks na przykład li
natomiast w przeciwnym wypadku chcę zwrócić tutaj new error
jeżeli ten tag byłby w jaki sposób niepoprawny oczywiście my tutaj nie bierzemy pod
uwagę naprawdę bardzo wiele scenariuszy które mogłyby mieć miejsce i na przykład
w bibliotece jquery one w kodzie są wzięte pod uwagę ale musielibyśmy mieć
tak naprawdę kilka tysięcy linijek kodu żeby to wszystko móc zrealizować a nie
o to chodzi w naszym przykładzie natomiast jak widzisz jeżeli ten tag będzie poprawny to
zwrócimy sobie to co zwróci document create element i to zostanie zwrócone z
całej tej funkcji a więc to znajdzie się tutaj pod nodes więc nie będę
się to nodes w tym sensie że nie będzie to tablica z wieloma elementami ale
po prostu jeden element node natomiast w ostatnim przypadku jeżeli byśmy
już tutaj przekazali odpowiednio element wyszukany na stronie w jakikolwiek sposób to
po prostu przypiszemy go nodes czyli tyle tutaj musimy sobie zrobić no
i skoro już wiemy na tym etapie że w nodes na pewno są jakieś elementy albo
w formie tablicy albo w formie pojedynczych elementów to teraz będziemy chcieli
je przekazać dalej na tym etapie ta funkcja init powinna coś zwracać
więc chciałbym zwrócić equery które zaraz sobie załadujemy będzie to klasa nie
chodzi tutaj o to equery które przypisałem na samym dole do window i następnie
chciałbym na tej klasie mieć statyczną metodę create której przekażę nodes dlaczego
musi ta funkcja coś zwracać bo zauważ że init przypisaliśmy do equery czyli
kiedy wywołujemy equery coś przekazujemy i ona powinna coś zwrócić tutaj właśnie
pod tą zmienną w tym przypadku lis dlatego chciałbym sobie utworzyć
klasę którą będziemy tutaj mogli na górze sobie zaimportować dlatego najpierw
zróbmy może import żeby nie zapomnieć będzie to defaultowy import
o nazwie equery from i będziemy chcieli sobie w tym katalogu gdzie
jesteśmy obok utils utworzyć katalog library i wewnątrz będziemy mieli
equery js będzie to główna klasa dlatego teraz
tutaj chciałbym ją utworzyć ten plik zapisze i w examples 69
start js utworzymy katalog library i następnie equery js ok
i tutaj będę chciał tę klasę utworzyć i wyeksportować więc napiszmy class equery
jest to jakaś klasa i na końcu napiszę export default
equery mógłbym od razu zrobić export na samej
górze w tym przypadku zrobię to w ten sposób tak klasa będzie mieć jakiś
konstruktor i ten konstruktor będzie przyjmował
nodes czyli to co tam przekazaliśmy do tego create za moment taką metodę create będziemy
chcieli sobie dodać zróbmy sobie to w formie właśnie statycznej metody po
prostu łatwiej ci będzie na tym pracować napisz create też
będzie otrzymywać nodes i po prostu ona będzie zwracać equery już w
tym kursie ci coś takiego pokazywałem czyli dokładnie new equery nodes
dzięki temu że mamy taką statyczną metodę dodaną to tutaj się łatwiej trochę
pracuję kiedy tą klasę już zaimportowaliśmy to tutaj mogę na statycznej metodzie
to zrobić nie muszę pisać return new equery chociaż jak najbardziej byłoby to poprawne ja
po prostu zrobiłem to w ten sposób czyli equery create przekazuje mu ten nodes pamiętasz
że będzie to albo już tablica albo pojedyncze elementy takie już dom
czyli obiekty dom metoda create otrzyma nodes czyli jest ona
tutaj i zwróci z powrotem to co zwrócili new equery czyli tak jak byśmy wywołali
ten konstruktor w nim otrzymamy nodes i właśnie to co jest teraz ważne
to będę chciał sprawdzić bo zawsze chcę przechowywać tablice czy przekazane
node są tablicą wiesz że tablicą będą na przykład w przypadku find elements
dlatego że tutaj zrobiliśmy sobie to w ten sposób czyli array
from i to zwraca tablice w pozostałych przypadkach to nie będzie tablica dlatego
chcę tutaj sobie to sprawdzić czyli jeżeli not array is
array to jest metoda w es5 która sprawdza czy podane obiekt jest tablicą czyli
jeżeli node przekazany tutaj nie są tablicą to chcę tą lokalną zmienną nodes
nadpisać tablicą do której wstawię nodes w ten
oto sposób natomiast jeżeli to jest tablica to ten warunek się nie wykona
i teraz mamy kolejną bardzo ważną rzecz otóż chcielibyśmy gdzieś
ten nodes zapisać ja chciałbym to zrobić w taki sposób prywatny że jeżeli zwrócimy
sobie taki obiekt lis to nie będzie tam gdzieś pod spodem lis na przykład
nodes że nie będę mógł w ten sposób się do nich odwołać bo
gdybym tak się do nich mógł odwołać to tutaj musiałbym napisać this na przykład
nodes równa się nodes i wtedy w każdej metodzie na prototypie będziemy
mogli skorzystać z tych elementów ale nie będzie to prywatne będę chciał tutaj
wykorzystać weak mapę czyli na samej górze utworze sobie
stałą którą nazwę podkreślnik nodes tak żeby zasugerować że jest to prywatne
i w tym module rzeczywiście będzie to prywatne nikt do tego nie będzie miał dostępu poza
tą klasą więc napiszemy sobie nodes równa się new bitmap jeżeli
nie pamiętasz jak działają weak mapy to koniecznie wróć sobie do tej lekcji w tym kursie natomiast
do tej weak mapy jako klucz możemy podać jakiś obiekt a jako wartość zupełnie
dowolną wartość w javascripcie więc teraz będę chciał napisać nodes
set i jako obiekt podamy this czyli
kluczem w tej weak mapie będzie nowo utworzony obiekt bo w konstruktorze pamiętasz
jeżeli zrobimy new equery będziemy mieli taki nowy obiekt który następnie
zostanie zwrócony tutaj czyli pod właśnie nodes this chcę
sobie coś zapisać a konkretnie nodes mam nadzieję że ma
to sens i teraz na prototypie będziemy mogli za moment się do tego odwoływać a więc
jeżeli taki element tutaj zostanie zwrócony czyli to co było pod this nie ma szans napisać
tutaj żaden sposób nodes i się do tego odwołać bo po prostu musi mieć odwołanie
do weak mapy drugą ważną rzeczą jest to że jeżeli obiekt
który mamy tutaj zostanie usunięty to również ta tablica nodes może być z pamięci
wyczyszczona czyli jeżeli tutaj mamy odwołanie do tego lis a następnie
nadpiszemy to nullem powiedzmy czyli nie mamy już referencji do
tego obiektu to i z tej weak mapy może być wszystko bez problemu usunięte
okej czyli tak by nam to wyglądało i teraz na prototypie tej klasy
chciałbym dodać metodę get ona nam się przyda w innych metodach ale również będzie dostępna
dla użytkownika czyli będzie mógł sobie napisać lis get i pobrać
sobie wszystkie te nodes czyli mówiłem że nie będzie dostępu na przykład w ten sposób ale za
pomocą metody którą udostępniam już tak i ona zwróci nam właśnie tablice
z tymi wszystkimi elementami które są zapisane wewnątrz więc musimy ją dodać na
prototypie dlatego tutaj dodamy metodę get i ona będzie bardzo
prosta otóż będzie zwracać nodes get this czyli
jeżeli ustawiliśmy coś w tej weak mapie za pomocą this czyli nodes to teraz jeżeli
przekażemy this do get to otrzymamy z powrotem nodes a nodes to będzie tablica
tutaj upewniamy się że w każdym przypadku jest to tablica okej
przetestujemy to sobie zatem tutaj w test napiszmy po prostu console log lis get
zobaczmy czy to działa przejdę tutaj odświeże i widzimy że mamy
tutaj oczywiście li czyli udało nam się to poprawnie zwrócić powinno
tutaj być i jednak nie jedno li a tych li więcej więc zobaczmy
czy gdzieś przypadkiem nie popełniliśmy błędu jeżeli wywołujemy sobie to tutaj okej
nie ma błędu ale tworzymy nowy element dlatego jest tylko jeden ale
jeżeli zamienimy to w ten sposób mówiąc że chcę wyszukać elementów na stronie zobaczmy to
tym razem będzie ich już jak widzisz więcej czyli nasza biblioteka zaczyna poprawnie
działać i teraz jeszcze jedną rzeczą którą chciałbym do niej dodać w tej lekcji będzie
iterator dlatego że chciałbym móc na przykład napisać for i powiedzmy
li of lis i wyświetlić sobie w konsoli
takie pojedyncze li to nam teraz wygeneruje błąd bo nie mamy iteratora
ale możemy go na tej klasie dodać i w tym kursie wielokrotnie ci to już pokazywałem dodamy
go za pomocą funkcji generującej i napiszemy symbol iterator
też jest to dokładnie tłumaczone w lekcji o generatorach
i będę chciał tutaj robić yield ale żeby tutaj nie musieć
iterować to wiemy że wewnątrz w tym nodes w tej weak mapie mamy
zapisaną tablicę czyli metoda get zwraca nam zawsze tablicę bo tutaj
upewniliśmy się że jest to tablica dlatego tutaj sobie napiszę this get
kiedy wywołam tę metodę to zostanie mi zwrócona tablica z naszymi elementami
i zrobimy delegowanie generatorów które było w lekcji właśnie pod tym
samym tytułem to oznacza że wszystko co jest w tej tablicy będzie
tutaj poprawnie zwracane więc teraz jeżeli odświeżę mamy reference
error jeszcze zobaczmy tutaj bo nie napisałem let okej i
teraz jest okej możemy sobie pętlą for off iterować po
całym naszym zestawie który został zwrócony z naszej biblioteki equery
w tej lekcji zatem to już wszystko w razie czego na spokojnie przejrzyj
sobie ten kod i widzisz że teraz moglibyśmy kolejne metody dodawać tutaj
na tej klasie equery metody do pracy na przykład z css czy z klasami powiedzmy at class
czy remove class tak jak w jquery natomiast żeby nie zaśmiecać tego pliku to będziemy
to chcieli zrobić w osobnych modułach i zaczniemy robić to w lekcji kolejnej