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 pokażę ci jak możemy rozszerzać prototyp klasy poprzez
tak zwane mixiny skup się uważnie na tej lekcji bo jest ona naprawdę ważna i myślę
że pokażę ci coś niezwykle ciekawego przejdziemy sobie do naszego kodu i chciałbym
zrobić tak żeby nie pisać wszystkich metod w tej klasie dlatego że już widzisz że jeśli
bym tutaj dodawał sobie metody do tego prototypu to one wszystkie są dostępne
później na zwróconym obiekcie czyli gdybym do tych elementów li chciał dodać klasę
na przykład add class klasa to mogę dodać metodę dokładnie
gdzieś w tym miejscu będzie to metoda add class która może operować na tych wewnętrznych elementach
i może im dodawać klasę w dowolnym wybranym przeze mnie sposób ale szybko
ten kod by nam się zaśmiecił dlatego chciałbym sobie utworzyć zupełnie osobne pliki
w których będą odpowiednie moduły i teraz pytanie czy w tych osobnych plikach do
pracy na przykład atrybutami czy z klasami czy będą tam klasy które
w jakiś sposób będziemy tutaj dziedziczyć pokażę ci że niekoniecznie tak być musi
zrobimy sobie to bardzo ciekawy sposób otóż chciałbym sobie utworzyć
plik który będzie tutaj w library i będzie się nazywał attributes więc przejdźmy
sobie do przykładu 70 start js library
i tutaj attributes będzie to moduł do pracy właśnie atrybutami
czy na przykład z klasami i z kodem css można było go nazwać być może
inaczej ja nazwałem go w ten sposób i tutaj chciałbym coś wyeksportować ale
co ciekawe nie będzie to klasa będziemy chcieli sobie wyeksportować default
czyli bez nazywania po prostu wyeksportować obiekt możemy to w ten sposób zrobić
i od razu ci powiem że będziemy go chcieli tutaj zaimportować zanim
zatem cokolwiek dodamy do tego obiektu tutaj będą mogły być różne rzeczy to
chciałbym go tutaj móc na samej górze zaimportować więc napiszmy sobie import
i napiszemy attributes from
i teraz musimy zerknąć na ścieżkę skoro jesteśmy tutaj w tym samym katalogu to
napiszemy po prostu attributes js dzięki temu że zrobiliśmy tutaj defaultowy export
to cały ten obiekt zostanie zapisany pod stałą tutaj attributes i będziemy
coś z tym mogli zrobić i teraz do tego obiektu chciałbym sobie dodać metodę
attr czyli chciałbym móc tutaj na tym lis napisać
attr i ustawić atrybut na przykład style na wartość
color red czyli tutaj robię metodę troszeczkę
podobne jak znajdziemy w jquery czyli na przykład attr ona działa
także jeżeli podamy jej tylko jeden parametr to chcemy zwrócić wartość
takiego atrybutu jeżeli podamy 2 to chcemy ustawić i taką metodę
chcielibyśmy sobie dodać tak naprawdę tutaj na prototypie equery jak zatem
to można zrobić ja ją najpierw dodam tutaj w tym obiekcie które eksportujemy napiszę
attr i nie muszę pisać że jest to function w ten sposób bo
wiesz już że w es6 mamy te skrócone zapisy w obiektach więc mogę od razu to
napisać tak no i skoro do tej metody attr można podać klucz i wartość
tak jak pokazałem to tutaj to jest klucz to jest wartość to chcemy je tutaj przechwycić
i teraz chciałbym sprawdzić czy został podany na przykład tylko klucz a więc style
napiszę sobie zatem coś takiego jeżeli key nie jest równy undefined
a więc został podany ale jednocześnie var jest równy undefined
czyli nie zostało podane to będę sobie w jaki sposób chciał zwrócić
tutaj zrobimy return bo chcę zwrócić wartość atrybutu tutaj muszę mieć
dostęp do elementu w jaki sposób to o tym za sekundę i jeśli będę miał dostęp
do tego elementu to natywną metodą z obiektowego modelu dokumentu będę chciał
za pomocą get attribute zwrócić sobie wartość tego atrybutu spod key
czyli jeżeli ktoś mi tutaj poda tylko style ten warunek się
wtedy wykona i będę chciał zwrócić to co mi zwróci na elemencie get attribute key ale
teraz jak ten element zwrócić otóż to za chwilkę przy piszemy w pewien ciekawy
sposób do prototypu a na prototypie dodaliśmy metodę get ona
jest też publiczna ale my będziemy też z niej korzystać i ona nam zwraca wszystkie
nodes natomiast jquery również działa tak że jeżeli tutaj byśmy chcieli
dla tych elementów li ustawić atrybut style to ustawi w
pętli dla wszystkich bo tutaj ich może być oczywiście więcej w tym przypadku mamy
kilka tych elementów li natomiast jeżeli pobieramy atrybut to pobierze
nam tylko wtedy z pierwszego elementu tak działa jquery i my zrobimy podobnie więc w tym
przypadku chciałbym mieć dostęp tylko do pierwszego elementu więc napiszę this get to
mi zwróci wszystkie elementy będzie to tablica i w tej tablicy mogę się dostać do
pierwszego natomiast chciałbym to zrobić tak że tutaj do
get można od razu przekazywać parametr na przykład 0 i to mi zawraca odpowiedni
element czyli this get przypominam jest to metoda którą już tutaj mamy
która z weak mapy zwraca nam wszystkie elementy teraz będziemy
zatem chcieli ją zmodyfikować dodając sobie tutaj coś takiego jak index i teraz
tutaj napiszę sobie let nodes równa
się to co mieliśmy pod spodem czyli chcę sobie to zapisać takiej oto zmiennej i
następnie będziemy chcieli sprawdzić czy podany index jest wartością
numeryczną więc zrobimy to poprzez if i wykorzystamy metodę którą
też ci w tym kursie pokazywałem nowa metoda statyczna na number is integer sprawdzimy
czy przekazany index jest wartością właśnie numeryczną jeżeli tak to będę
chciał zwrócić nodes index czyli na przykład pierwszy
element w przeciwnym wypadku zwracamy wszystkie czyli całą tablicę
nodes mam nadzieję że ma to sens więc jeżeli teraz tutaj podam get 0 to
będę chciał zwrócić tylko pierwszy element i pobiorę sobie jego atrybut kiedy
będę miał atrybut to będę mógł zwrócić jego wartość czyli
w tym momencie jeżeli tutaj wykonamy list attr style to wykona
się ta linijka i pobierze nam get attribute style natomiast teraz
będę chciał stworzyć jeszcze blok tutaj drugi else i przeciwnym
wypadku będę chciał ustawić wartość atrybutu czyli jeżeli obydwa
te parametry nie będą miały wartości undefined jak możemy to zrobić otóż
potrzebujemy jakiejś iteracji czyli skoro wiem że this get może mi
zwrócić wszystkie elementy to mógłbym tutaj na nich iterować na przykład metodą for each
zrobilibyśmy coś takiego no i tutaj mielibyśmy jeden element na przykład na przykład lm i chcielibyśmy
zrobić lm i następnie set attribute ustawilibyśmy key i value
to jest też metoda natywna z obiektowego modelu dokumentu natomiast bardzo często będziemy
jeszcze w tej bibliotece korzystać z takiej iteracji jak tutaj for each i dlatego chciałbym
utworzyć do tego celu metodę pomocniczą więc jak możemy to zrobić chciałbym
tutaj napisać po prostu this each i musimy ją dodać zaraz na prototypie
i tutaj funkcją strzałkową możemy sobie to uprościć do funkcji each chciałbym
przekazywać node w ten sposób i dlatego node chciałbym postawić set attribute
na key value czyli
taka metoda nie istnieje ale teraz ją sobie możemy dodać i zanim
jeszcze zrobimy całą mixinę o której wspominałem wcześniej to chciałbym dodać sobie taką metodę each
i chciałbym żeby ona też była publiczna czyli tutaj żeby ktoś mógł napisać na przykład lis each
i coś sobie z tym zrobić dlatego też ją będziemy chcieli dodać na prototypie ale
też nie chcę jej dodawać tutaj nie chcę już nic mieć więcej tutaj w tej klasie query dlatego dodamy
to sobie w osobnym jeszcze pliku i tutaj sobie go zaimportuje i zaraz go utworzymy
on się będzie się nazywał iteration chcę to wszystko ładnie dzielić po
to żeby można było ewentualnie tę bibliotekę rozwijać czyli będzie to iteration
js to mogą być metody do iterowania utwórzmy je sobie teraz w
examples 70 start js library
iteration i zrobimy podobnie jak tutaj w attributes czyli export default
mamy taki oto obiekt i tutaj
będę chciał stworzyć metodę each ona mi będzie przyjmować
tutaj pod parametrem nodes bo będzie mieć do nich dostęp będzie jedynie przyjmować funkcje
napiszemy fn i teraz jeszcze raz chcę ci to pokazać jeżeli
wykonamy this each to tutaj przekazałem funkcję dlatego tutaj each musi
przyjmować jakąś funkcję i ona będzie mieć dostęp do wszystkich parametrów od razu czy
do wszystkich nodes bo będzie też dodane na prototypie czyli this get zwróci
wszystkie elementy node i tutaj wykonamy pętle for each czyli tą standardową
dostępną na tablicach w ecmascript 5 już i tutaj jej zawsze musimy
przekazać funkcję do wykonania skoro tę funkcję przekazaliśmy pod each mamy ją
tutaj nie ważne że jest to funkcja strzałkowa po prostu przekażę ją w to miejsce czyli
teraz utworzyłem sobie metodę pomocniczą each która będzie dostępna i tutaj
na przykład lis kropka each i w każdym z moich plików dzięki temu tę funkcję
wykonam dla każdego elementu ale tutaj nie musiałem pisać this get żeby te
elementy pobierać mam nadzieję że ma to sens i teraz pozostało nam najważniejsze
czyli sprawić żeby ta metoda each a także ta
metoda z tego obiektu attr w jakiś sposób znalazły się na prototypie tego
konstruktora czy tej klasy equery wiesz że możemy rozszerzać
inne klasy pisząc tutaj extends ale nie utworzyłem attributes
iteration jako klasy zauważ, że tutaj po prostu są to zwykłe obiekty
dużo łatwiej się to zapisuje ale jak rozszerzyć taki zwykły obiekt nie
wiem czy pamiętasz w lekcji o klasach jak ci mówiłem że możemy rozszerzać nie tylko klasy ale
też funkcję czyli jeżeli do tej pory w javascripcie mieliśmy jakąś funkcję gdybym
tutaj miał powiedzmy const fn byłaby
to normalna funkcja każda funkcja ma prototyp to mógłbym tutaj napisać że moja
klasa rozszerza fn czyli jeżeli na prototypie tej funkcji byłyby dodane
takie metody jak each czy attributes to one też pojawiłyby mi się w mojej klasie więc
mógłbym z nich bez problemu korzystać a w tych metodach na przykład this get kierowałoby
też odpowiednio na tę metodę get więc naszym celem będzie podstawie sobie
tutaj funkcji która będzie mieć na swoim prototypie to co tutaj mamy czyli
wracamy sobie obiekt iteration i attributes i mamy je tutaj są to dwa
obiekty dlatego teraz pokażę ci w jaki sposób możemy to zrobić aby to
wszystko działało poprawnie utworzyłem sobie funkcję fn i ona ma prototyp
i nie wiem czy pamiętasz ale metodą object assign możemy
podać tutaj jakiś obiekt do którego chcemy skopiować wszystko co znajduje się tutaj
czyli tutaj moglibyśmy mieć jakieś inne obiekty podajmy sobie tutaj attributes i iteration wiemy
że są to obiekty bo obiekty eksportujemy a więc każda właściwość takiego obiektu
każda metoda będzie skopiowana stąd tutaj i stąd tutaj natomiast
do jakiego obiektu chcemy to skopiować oprócz do tego fn prototype bo
wiemy że funkcja ma prototyp prototyp jest obiektem domyślnie na tym prototypie tutaj
jest pusta funkcja nie będzie żadnych metod więc będziemy chcieli sobie tutaj metody
dodać więc jeżeli pamiętasz jak działa assign to dokładnie tak to będzie wyglądać
i teraz ta funkcja na prototypie będzie mieć już odpowiednie metody oczywiście
tutaj jeszcze popełniłem błąd bo jeżeli robię const to powinienem tutaj przypisać funkcję
w ten sposób teraz będzie okej i teraz tę funkcję rozszerzymy A więc
Nasza Klasa na swoje metody ale teraz rozszerza tę funkcję a więc dziedziczy również
metody z jej prototypu i teraz zobaczymy czy to wszystko ma sens tak
natomiast jeżeli dziedziczymy skądkolwiek to musimy wykonać konstruktor super
czyli tutaj w naszym konstruktorze wystarczy że napiszę super pamiętasz
że jest to obowiązkowe i okazuje się że wszystko działa jak należy jeżeli
teraz bym sobie tutaj w test napisał list attr style
i chciał go ustawić na przykład na kolor red zobaczmy
wszystkie elementy otrzymały taki atrybut jak widzisz działa to wyśmienicie
dlatego że wykonaliśmy pętle za pomocą właśnie iteration a konkretnie
znaleźliśmy się w tym miejscu natomiast gdybyśmy chcieli pobrać wartość takiego
oto elementu to moglibyśmy to zrobić wpisując tutaj
console log w ten sposób
i wtedy pobierzemy wartość tylko pierwszego elementu zobaczmy jaka to jest wartość jest
to null bo te elementy nie mają takiego atrybutu na początku jak style
natomiast to będzie pracować poprawnie z każdym innym atrybutem więc może sobie
to zostawmy w takiej formie i na koniec tej lekcji chciałbym jeszcze ten fragment kodu
zrobić w taki sposób żeby on był po prostu ładniejszy z tego powodu utworzymy
sobie tak zwaną mixinę i wstawimy ją sobie do examples 70
następnie do start js i tam mieliśmy utils i
będę chciał utworzyć metodę czy w zasadzie moduł który nazywa się mixin przejdźmy
tutaj i z niego będziemy chcieli wyeksportować export function mixin
i ta funkcja będzie przyjmować tutaj obiekt do którego chcemy
coś dodać chociaż w zasadzie nawet nie jest to konieczne zrobimy to prościej będziemy
tutaj chcieli przyjmować operatorem rest różne mixiny okej
więc zanim cokolwiek zrobimy to chciałbym sobie mixinę zaimportować
tutaj w equery zróbmy zatem import mixin mam
nadzieję że piszesz razem ze mną wtedy to wszystko na pewno ma sens from
i tutaj musimy podać ścieżkę o jeden katalog wyżej następnie i utils
mixin js czyli mamy już taką mixinę i teraz pokażę
ci jak chciałbym ją wywołać otóż właśnie tutaj gdzie mieliśmy
fn to chciałbym napisać mixin i przekazać attributes
oraz iteration teraz to będzie pewnie miało więcej sensu zobacz to wszystko
co było tutaj wytnę sobie i teraz jeżeli do mixin
przekażę attributes i iteration to chciałbym żeby ona zwróciła właśnie nową funkcję
która na prototypie to mieć będzie więc dodaje je sobie tak i
będę mógł dowolną liczbę ich dodać dlatego że zbieram je atrybutem mixins czyli
pod mixins będę miał po prostu tablice z tymi poszczególnymi obiektami
takimi jak ten obiekt czy ten obiekt i teraz tutaj wewnątrz
będę chciał utworzyć sobie funkcję taką pustą i następnie
do jej prototypu dobrać właśnie wszystkie te rzeczy więc tym razem operatorem
spread rozstrzelimy to wszystko czyli pod mixins mamy tablice rozstrzeliwujemy
ją więc jest efekt taki sam jak byśmy wszystkie te rzeczy wpisali tutaj ręcznie
to już tym kursie widziałeś więc napiszmy mixins okej i na końcu chcę
zwrócić tą funkcję tyle wystarczy i zobacz o ile ten kod jest lepszy jeżeli
będę chciał dodawać sobie cokolwiek do prototypu naszego equery to
wystarczy że podam to tutaj dowolny obiekt który tutaj podam to jego metody pojawią
się na prototypie sprawdźmy czy to działa jak widzisz wszystko działa jak należy ta lekcja
była dosyć długa ale mam nadzieję że załapałeś o co w niej chodzi polecam ci
żebyś ten kod pisał razem ze mną i po kolei wszystko robił wtedy będzie to na pewno
miało sens natomiast w kolejnej lekcji zajmiemy się już dodaniem kolejnych metod
które będą przydatne dla naszej biblioteki