Warsawjs workshop 43 - intermediate javascript training
Opis warsztatu
Podczas warsztatów będziemy wykorzystywać wyłącznie przeglądarkę internetową ze wsparciem ES6+.
Warsztat posiada formę zadań do rozwiązania.
Na każde zadanie przygotowany jest test. Nie można zmieniać kodu testu.
Funkcje, które należy zaimplementować są już stworzone. Podczas warszatu nie trzeba tworzyć żadnych nowych plików.
Aby odpalić testy, otwórz plik index.html w przeglądarce, i otwórz narzędzia deweloperski i znajdź konsolę.
Wynik testów jest wyświetlony w przeglądarce w konsoli narzędzi deweloperskich. Zadanie jest rozwiązane, jeśli test nie rzuca błędem.
Zadania są podzielone tematycznie. W kolejnych plikach z testami zostały wydzielone tematy.
Po wykonaniu zadań stworzony kod wykorzystamy w działającej aplikacji — prostej grze w wisielca (projekt na github).
W ramach utrwalenia wiedzy dodamy ładowanie haseł z pliku oraz wyabstrahujemy część kodu odpowiedzialną za stan aplikacji przy użyciu klas.
Klasy Pierwszym etapem warsztatu jest zrozumienie klas.
Teoria
Najprostszym określeniem klasy jest stwierdzenie, że to przepis na obiekt.
Klasy zawierają pola oraz metody.
Pola przechowujące dane, podczas gdy metody są funkcjami związanymi z klasą.
Aby stworzyć obiekt na bazie klasy, należy wykorzystać operator new.
Stworzony obiekt nazywamy instancją klasy.
Klasy mogą po sobie dziedziczyć, tworząc relację typu rodzic-dziecko.
Klasa może dziedziczyć tylko po jednej klasie.
Klasa dziecka ma dostęp do pól i metod klasy rodzica.
Każda klasa posiada konstruktor.
Jest to specjalna metoda klasy, która jest wywoływana podczas tworzenie instancji klasy.
Jeśli klasa nie definiuje konstruktora, użyty będzie domyślny konstruktor.
Konstruktor może przyjmować argumenty, które można wykorzystać do ustawienia stanu inicjalnego instancji.
Jeśli klasa dziedziczy po innej klasie, musi wewnątrz konstruktora zawołać specjalną funkcję super z argumentami, które są wymagane do stworzenia instancji klasy nadrzędnej.
Klasy mogą posiadać metody i pola statyczne — dostępne bez tworzenia instancji klasy.
Zadania
Zadanie polega na stworzeniu klasy, która będzie opisywała zachowanie obiektu przechowującego dane.
Taka abstrakcja często jest nazywana jako Model.
Dodatkowo należy stworzyć model dziedziczący, który będzie reprezentował stan aplikacji.
Zaimplementować klasę Model, która ma możliwość przechowywania danych.
Klasa powinna udostępniać interfejs umożliwiający dostęp do zapisu i odczytu wyłącznie przez metody instancji klasy.
Metoda set do ustawiania wartości pola. * Metoda get zwracająca wartość danego pola.
Dodać do klasy Model możliwość sprawdzania, czy pole istnieje
Metoda has zwracająca true/false w zależności od tego, czy pole istnieje w instancji klasy.
Rzucić wyjątek podczas pobierania nieistniejącego pola
Metoda get powinna sprawdzić, czy pole istnieje i tylko wtedy zwrócić wartość.
Jeśli pole nie istnieje, metoda powinna rzucić wyjątkiem z odpowiednią treścią.
Umożliwić łączenie wywołać metody set
Metoda set powinna mieć możliwość wielokrotnego wywołania, jedno po drugim w łańcuchu wywołań (a.set(...).set(...);)
Umożliwić łączenie wywołać metody set i get
Metoda set oraz get powinna mieć możliwość wielokrotnego wywołania, jedno po drugim w łańcuchu wywołań (a.set(...).get(...);)
Wywołanie get powinno być możliwe tylko dla ostatniego wywołania w łańcuchu.
Zaimplementować klasę dziedziczącą State po klasie Model posiadający jedno pole z inicjalną wartością
Instancja klasy po stworzeniu powinna posiadać ustawiony stan inicjalny.
Stworzyć metodę statyczną createInitialState, która będzie dostępna bez instancji klasy
Klasa musi posiadać statyczną metodę createInitialState.
Promise, fetch api i praktyczne zastosowanie klas
Teoria
Promise jest to interfejs reprezentujący wynik działania, które ma nieokreślony czas trwania np. pobranie pliku.
Innymi słowy jest to obietnica wywołanej funkcji, że jej działanie skończy się w przyszłości i możemy czekać na wynik.
Aby czekać na wynik, należy zarejestrować zdarzenie, które ma się wydarzyć, kiedy funkcja skończy pracę i będzie gotowa zwrócić wynik.
W przypadku niepowodzenia (np. timeout sieci), mamy możliwość obsługi takiej sytuacji, rejestrując odpowiednio zdarzenie.
Do zarejestrowania zdarzenia wykorzystać metodę then, zwracaną po utworzeniu nowego obiektu typu Promise
Stwórz plik JSON, w którym będę znajdować się hasła do odgadnięcia w grze.
Wykorzystaj wcześniej stworzoną funkcję do pobierania danych.
Stan ładowania
Wykorzystaj klasę reprezentującą zasób w połączeniu z funkcją do pobierania danych, aby obsłużyć stan ładowania.
Aplikacja podczas ładowania powinna prezentować napis Ładowanie haseł, proszę czekać.
Wykorzystanie klasy reprezentującej stan aplikacji
Wykorzystaj klasę reprezentującą stan aplikacji, wszędzie tam, gdzie aktualnie aplikacja korzysta ze zwykłego obiektu i funkcji pomocniczej aktualizującej ten obiekt.