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 porozmawiamy o kolejnej nowości. Tym razem jest to już nowość. Coś
co nie było dostępne w ES5. Mianowicie możliwość dziedziczenia zbudowanych
typów w języku JavaScript, a więc chciałbym utworzyć klasę, która
będzie mogła dziedziczyć z array, czyli z konstruktora array. Można
powiedzieć z klasy array i chciałbym, żeby moja klasa nazywała się Collection i chciałbym,
żeby ona dziedziczyła, czyli extends array, a więc array jest
to wbudowany typ w języku JavaScript i teraz co to oznacza, że będę mógł niej dziedziczyć.
Za moment się przekonasz, więc stwórzmy sobie tutaj jakiś konstruktor albo jeżeli
go nie utworzymy. Okej może go nie twórzmy, to pamiętasz mówiłem w lekcji poprzedniej, że zostanie
utworzony automatyczny i wywołane z odpowiednimi parametrami, więc
spróbujmy sobie zrobić na razie tyle i teraz utwórzmy sobie nowy obiekt, który naziwmy call. Będzie
to new Collection i podajmy
sobie tutaj parametry takie jak byśmy podali gdybyśmy zrobili new array. Na przykład 10,
20, 30 i teraz spróbujmy sobie wyświetlić za pomocą console.log,
co nam pokaże col. Zobaczmy, jak widzisz pokazało
coś co wygląda w konsoli identycznie jak tablica i to co jest ciekawe, mamy
na tym właściwości length. Wszystko zostało poprawnie odziedziczone. Mamy na
przykład metodę slice, więc możemy sobie wyciąć coś od
zera do jednego. Zostanie nam zwrócona jakby ta nowa tablica, czyli
wszystko działa jak należy. Istnieje tutaj jednak pewna przypadłość,
która jest absolutnie ciekawa. Otóż, kiedy skorzystamy
na naszej klasie, czyli na kolekcji z metody
slice, to nie zostaje zwrócona nowa tablica, ale nowy obiekt w naszym,
w naszej klasie, czyli naszej klasy. To oznacza, że to co zostało zwrócone i
może sobie to zróbmy w ten sposób. Napiszmy let colPart
równa się col slice, właśnie na przykład 0 1,
okej. I teraz sprawdzimy czy colPart jest
instancją, czyli za pomocą instanceof Collection. Okaże
się, że jak najbardziej, czyli to jest o tyle ciekawe, że skorzystaliśmy z metody,
której my nie dodaliśmy, ona jest na array, ale w momencie kiedy na tej metodzie,
czy z tej metody skorzystaliśmy, a ona ma zwrócić nową instancje,
w tym przypadku byłoby to tablicy, to ona wie, że powinna zrobić nową instancję
Collection. Co to dla nas oznacza? Otóż, jeżeli bym tutaj dodał sobie dowolną metodę,
na przykład iterate, która by po prostu
tutaj robiła jakąś pętle i powiedzmy wyświetlała te elementy, to to co nam zostanie
zwrócone z kolei col slice, czyli colPart, ma dostęp do iterate, a gdybyśmy
utworzyli sobie nową tablicę z użyciem new array, to ona by do tego dostępu nie miała,
bo dziedziczymy, Collection dziedziczy z array, a array nie wie nic
o Collection. Tak można by było tutaj powiedzieć. Pokażę ci teraz jak moglibyśmy
troszkę zmodyfikować sobie Collection, bo domyślnie na przykład array, nie wiem czy
wiesz, ale działają tak, że jeżeli podamy sobie tylko jeden parametr, gdybyśmy tutaj zrobili new
array, to wyglądałoby to w ten sposób, że zostanie
utworzona nowa tablica, która nie ma dziesiątki w sobie, ale 10 razy ma wartość undefined.
Możemy sobie to sprawdzić wywołaj my tutaj col i zobacz 10 razy jest undefined. Gdybym
chciał sobie zmienić takie zachowanie, to mógłbym sobie to zrobić w
swoim konstruktorze. Dodamy sobie konstruktor i chciałbym,
żeby on mógł przyjmować dowolną liczbę argumentów, a więc skorzystamy z operatora rest,
które już znasz. Zatem, jeżeli tutaj dodamy ich więcej to one, w formie tablicy zostaną mi przekazane
do args i teraz sprawdzimy. Jeżeli został przekazany tylko jeden parametr,
to nie chcę tworzyć tak jak widziałeś nowej tablicy, która ma na przykład 10 razy undefined,
tylko chcę utworzyć nową tablicę, która będzie miała tylko dziesiątkę, więc
możemy sobie to sprawdzić. Napiszemy if args length równa
się 1, czyli tylko 1 został przekazany to wywołamy sobie konstruktor
rodzica. Nie wiemy jak on wygląda w przypadku array, ale za pomocą super
możemy go wywołać i pamiętasz, że jeżeli tam po prostu przekażemy 1 parametr
tak jak tutaj, no to będziemy mieli nową tablicę która na tyle elementów
dlatego napiszę 1. Jeżeli został przekazany 1, to chcę utworzyć nową
tablicę z 1. Czyli to by wyglądało tak jakby napisał new array 1 i zwróćmy
sobie to do zmiennej a. To sprawi, że będę miał tablice, która
ma długość 1, czyli a length, ale
jest pusta. To zostanie mi zwrócone i następnie będę mógł się odwołać
do this. Pamiętaj, że to this, to już jest obiekt naszej kolekcji, ale że dziedziczymy
z tablicy, to ma ona na przykład indeksy. Będzie można je w ten sposób dodawać, czyli
pod indeksem zerowym będę chciał przekazać to co jest pod args 0, czyli innymi
słowy, została przekazana dziesiątka. Sprawdziliśmy czy jeden argument został przekazany. Tak,
więc tutaj utworzyliśmy można powiedzieć nową tablicę, która ma długość 1
i następnie przypisaliśmy pod pierwszym argumentem to, co było tutaj w args
gdybym tego tutaj nie zrobił to mielibyśmy z kolei błąd, bo musimy
skorzystać z super. Dlatego to wykonałem, czyli na tym etapie będziemy mieli nową
tablicę, która będzie miała w sobie dziesiątkę, a nie 10 elementów undefined. Natomiast w
przeciwnym wypadku będziemy chcieli po prostu wywołać super i przekazać
mu operatorem spread wszystkie argumenty, które ktoś przekazał, jeżeli ich tutaj będzie
więcej, więc podejżyjmy jak to działa. Wpiszę sobie col i zobacz,
mamy tablice, która ma tutaj tylko jedną dziesiątkę. Tak naprawdę nawet nie
jest to tablica, tylko jest to nasza nowa trasa, nasz nowy typ Collection, który dziedziczy z
tablicy i teraz zmieniliśmy to zachowanie. Natomiast gdybym sobie podał tutaj 20,
30, ten warunek się wykona i tak naprawdę przekażemy te
parametry do konstruktora array, czyli domyślne zachowanie będzie miał tutaj miejsce.
Odwołajmy się do col. Jak widzisz, mamy tablice z trzema elementami. Jak
zatem widzisz, w taki prosty sposób możemy sobie dziedziczyć z wbudowanych typów. Nie ze
wszystkich, ale tych typów jest kilka, z których możemy dziedziczyć. Na przykład ze stringu,
nawet z boolean, czy z Regex, czyli z wyrażeń regularnych. Nie
wiem czy to będzie aż tak bardzo przydatne w twojej codziennej pracy, natomiast wydaje mi się, że
dziedziczenie z tablicy, czyli z array może się w wielu przypadkach przydać, ale
pamiętaj, że działa to wyłącznie właśnie w EcmaScript 6 i jeżeli będziemy to później
jakoś polifilować do starszego zapisu, to nie będzie to działać poprawnie, bo
to już tutaj jest rzecz, której nie da się w stu procentach odwzorować w ES5.