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.
Choć jak widziałeś wersji poprzedniej, mamy wiele różnych pułapek, czyli tak zwanych traps, z
których możemy korzystać jeżeli chodzi o Reflect API, to w tym kursie nie będziemy
ich wszystkich omawiać, bo ja uważam, że nie jest to aż tak bardzo przydatne w codziennej takiej
normalnej pracy z kodem ES6. Natomiast kiedy wiesz jak one działają czy
jak z nich korzystać, to będziesz mógł spokojnie sobie w wolnej chwili o nich więcej poczytać i
z nimi poeksperymentować. Natomiast ja bym chciał w tej lekcji pokazać ci jedną konkretną
pułapkę, która nazywa się apply i ona będzie dosyć przydatna, dlatego
chciałbym ci praktyczny przykład pokazać. Na stronie tutaj możemy przejść i zobaczyć jak
taka pułapka wygląda. Konkretnie jakie ona będzie przyjmować parametry. Widzimy je
tutaj, ale zanim przejdziemy do niej, to chciałbym ci pokazać, że mamy taki oto kod
i tutaj nie ma absolutnie nic nowego. Mówiłem ci tylko tyle, że nowy
zapis klas w EcmaScript 6 nie pozwala tworzyć nowych obiektów bez
słowa new. Zobaczymy, nie ma żadnego błędu, ale spróbujmy nie skorzystać
z new. Pojawi nam się błąd, bo class constructor Person cannot
be invoked without new, czyli nie możemy tutaj zrobić tego bez new, ale
co jest ciekawe możemy to zmienić. Gdybyśmy chcieli za pomocą Proxy API. Możemy
nad taką klasą utworzyć sobie proxy, więc napiszmy sobie może let
albo w zasadzie nawet const, czyli tak jak klasa, ta nazwa nie
może być zmieniona. To tą, którą utworzymy też nie będzie mogła być zmieniona. Napiszmy PersonProxy,
powiedzmy i będzie to tak jak w lekcji poprzedniej new Proxy. Zrobimy
to proxy nad Person i w tym obiekcie podajemy pułapki, których
może być kilka i pułapkę, którą ja chciałbym dodać jest to apply. Zobaczmy
jakie ona przyjmuje tutaj parametry. Możemy je sobie skopiować bezpośrednio
stąd i przejdziemy w to miejsce i teraz pytanie kiedy ona
się wywoła. Otóż apply wywoła się zawsze, kiedy funkcja jest wywoływana
bez new. Natomiast zawsze kiedy jest wywoływana z new. Wywoła
się z kolei pułapka gdybyśmy tutaj sobie wrócili, która nazywa się construct, więc
gdybyś chciał przechwycić kiedy ktoś korzysta z new na twojej funkcji, to
możesz skorzystać z construct i nie musisz tego robić z klasą. Możesz to zrobić dowolną funkcją.
Ja natomiast zrobię to apply i apply i się wywoła właśnie wtedy, kiedy
ktoś zrobi tutaj person, bez new. Tylko, że musimy
to zrobić na person proxy, a więc z naszego jakiegoś kodu czy z modułu zwracalibyśmy
takie oto Proxy i teraz zobaczmy co się wydarzy. Zobacz,
nie ma żadnego błędu. Natomiast co mamy pod person 1 czy
w zasadzie pod person, undefined. Normalnie
tutaj mieliśmy nowy obiekt, teraz mamy undefined, ale nie ma błędu. Dlatego, że ta pułapka
tutaj miała miejsce, czyli mogliśmy schwytać jakby ten błąd, który normalnie
zostałby wygenerowany, ale że z tej funkcji nic nie zwróciliśmy, to zostało zwrócone undefined
i dlatego to się znajduje pod zmienną Person. Teraz mógłbyś zapytać co
znajduje się pod target. Otóż pod target mamy całą klasę Person. Pod thisArg
mamy argument this. Gdyby to zostało wywołane na przykład z call
i ktoś w call jako pierwszy parametr przekazałby jakiś this, na przykład taki
obiekt, to pod this będę go miał, ale jeżeli to będzie wykonane normalnie w ten sposób,
to pod tym thisArg będę miał undefined. Natomiast argumentsList to
będzie tablica z wszystkimi przekazanymi tutaj argumentami, czyli tam będę miał Jan i Kowalski
i teraz jeżeli ktoś na naszej klasie skorzystał bez new. Normalnie byłby
to błąd, ale stworzyliśmy pułapkę, to co ja bym chciał zrobić, return new
target, to wiem, że jest to nasza klasa, więc napiszmy new target,
nie muszę pisać new person, tylko po prostu new target i pod
argumentsList mam wszystkie argumenty, takie jak Jan Kowalski w formie tablicy, więc
operatorem spread roztrzelimy je sobie, czyli będzie to dokładnie to samo jakbym
napisał new person i podał po kolei wszystkie parametry. To nam
zwróci nowy obiekt, który zwrócimy z metody apply. Zobaczmy teraz, nie
ma błędu i napiszmy person. Okazuje się, że wszystko działa, czyli za pomocą
takiej pułapki mogliśmy sprawić, że nasza klasa od teraz może
być wywoływana bez użycia słowa new, ale pamiętaj, że musimy to wywoływać
na obiekcie proxy, a nie bezpośrednio na klasie. No i wspominałem
w lekcji poprzedniej, że zazwyczaj korzystamy z Reflect API. Tutaj nie było to konieczne. Po
prostu zwróciłem sobie to, co chcę aby zwróciła mi ta metoda, kiedy
właśnie ktoś w ten sposób z niej skorzysta. Natomiast w większości przypadków takich jak
na przykład get czy ten operator delete, z którego możemy korzystać. Wewnątrz
tych pułapek będziemy korzystać z Reflect API i jak zatem widzisz,
tak to mniej więcej wygląda jeżeli chodzi o pracę z Proxy API. Nie będziemy
już tutaj więcej omawiać mam nadzieję, że załapałeś jakby ideę, czyli gdybyś
chciał wpłynąć na te, można powiedzieć, niskopoziomowe operacje, czyli
na przykład kiedy ktoś korzysta z operatora in, bo jest też taki operator, gdzie
możemy sprawdzić czy na przykład sayHello in person
i tak dalej, to wcześniej na to nie mogliśmy wpłynąć, a teraz można na takim person
ustawić pułapkę, żeby sprawdzić kiedy ktoś będzie korzystał na przykład
operatora in, czyli zawsze wtedy możesz ewentualnie zerknąć sobie do dokumentacji i
gdyby dla ciebie było to przydatne, to zastawić takie pułapki na
obiekcie proxy.