Klasy w JS
Klasy w JavaScript to specjalne funkcje, które służą jako szablony do tworzenia obiektów. Definiują one strukturę i zachowanie obiektów, określając ich właściwości (dane) i metody (funkcje do manipulacji danymi). Składnia class została wprowadzona w standardzie ES6, ułatwiając pisanie kodu, choć klasę można stworzyć także za pomocą tradycyjnych funkcji konstruktora.
- Szablon dla obiektów: Klasa jest jak plan, który określa, jakie dane (właściwości) i funkcje (metody) będą miały obiekty tworzone na jej podstawie.
- Metoda
constructor: To specjalna metoda wewnątrz klasy, która jest uruchamiana, gdy tworzony jest nowy obiekt. Służy do inicjalizacji właściwości obiektu. W konstruktorze możemy również umieścić wartości domyślne (np. this.isActive = false). To przydatne zwłaszcza przy tworzeniu wielu obiektów, które mają posiadać takie wartości. - Tworzenie obiektów: Obiekty tworzy się przy użyciu słowa kluczowego
new, np.const pet1 = new Animal(). - Składnia
classvs. funkcje konstruktora: Wprowadzenie składniclassuprościło pisanie kodu i jest obecnie powszechnie używane, choć wciąż można spotkać i zrozumieć sposób tworzenia obiektów za pomocą funkcji konstruktorów, który działa podobnie.
WAŻNE!
Klasy nie są hoistowane! Muszą być zadeklarowane przed ich użyciem bo inaczej dostaniemy błąd.
WAŻNE!
PODSTAWOWA SKŁADNIA KLASY:
Słowo kluczowe class rozpoczyna definicję.
Potem nazwa klasy, konwencjonalnie w PascalCase.
W nawiasach wąsatych konstruktor - wywoływana automatycznie metoda przy tworzeniu instacji. Służy do inicjalizacji właściwości obiektu.
Metody instancji klasy definiujemy bez słowa kluczowego function! Metoda będzie dostępna dla każdej instancji klasy
class User {
constructor(name, email) {
this.name = name;
this.email = email;
}
greet() {
return `Cześć, jestem &{this.name}`;
}
const user1 = new User ("Jan", "[email protected]");
const user2 = new User ("Anna", "[email protected]");
Tworzenie instancji:

Używanie instancji:

Przykładowe zadanie:
- Stwórz klasę dla obiektów ksiązka
- w klasie zdefiniuj właściwości które ksiązka może mieć (tytuł, ilosc stron, kategoria, autor, rok wydania)
- do obsługi obiektu zdefiniuj w klasie 2 metody: jedna pokazująca informacje o książce a druga kalkulująca ilość stron nieparzystych


METODY STATYCZNE
Mechanizm klasy pozwala na tworzenie metod i pól statycznych (czyli takich, które nie są dostępne z poziomu zewnętrznego, spoza klasy).
Metody publiczne możemy wywołać w dowolny sposób.
METODY STATYCZNE należą do klasy, nie do instancji!
Służą do operacji związanych z klasą jako całością. Są to głównie fabryki obiektów, walidatory, etc. Stanowią narzędzie klasy, dla wszystkich instancji. Metody statyczne nie mają dostępu do this.
Wywołujemy je przez: NazwaKlasy.metodaStatyczna()
Przykład: Math.random() --> to jest metoda statyczna wbudowana w obiekt Math


"FABRYKA OBIEKTÓW" - metoda, która tworzy gotowy obiekt z jakimiś przypisanymi wartościam. Jeśli chcemy mieć pewność, że ten obiekt będzie miał określone wartości, konkretną strukturę, to możemy użyć metody statycznej.
METODY WALIDUJĄCE DANE - niezależne od wartości danego obiektu

DZIEDZICZENIE
Dziedziczenie pozwala tworzyć nowe klasy na podstawie istniejących i dziedziczyć ich właściwości i metody. Dodatkowo pozwala na dodawanie i modyfikowanie tych, które już istnieją.
By dziedziczyć, potrzebujemy klasy Bazowej (nadklasy, rodzica), od której będziemy tworzyć potomną.

EXTENDS - służy do "rozszerzania" klasy (tworzenia klasy potomnej na podstawie klasy bazowej)
SUPER - to wywołanie konstruktora klasy bazowej. Dopiero po przekazaniu parametrów do konstruktora bazowego z pomocą słowa SUPER możemy użyć THIS i dodać nowe właściwości, specyficzne dla klasy potomnej.
class Potomna extends Bazowa {
constructor (wlasciwosc1, wlasciwosc2, wlasciwosc3) {
super(wlasciwosc1, wlasciwosc2);
this.wlasciwosc3 = wlasciwosc3;
}
}
KLASY: POLA PRYWATNE I PUBLICZNE
ENKAPSULACJA - tworzenie pól prywatnych które nie będą dostępne poza klasą. Większość właściwości będzie ukryta, a udostępniony bedzie jedynie niezbędny intetfejs. Próba odczytania właściwości z zewnątrz wywoła błąd.
Tworzy się je z użyciem hasha #
Enkapsulacja chroni dane przed niezweryfikowanym dostępem, przed przypadkową/pomyłkową modyfikacją, zapewnia nadzorowany dostęp do wrażliwych właściwości.

Pola prywatne wymagają wewnętrznych metod (w tym metod prywatnych, które również są definiowane z użyciem symbolu hash ( # ) ) by uzyskać do nich dostęp.
UWAGA!
Możemy wywołać metodę prywatną z metod publicznych:

UWAGA!
Możemy wywołać metodę prywatną z metod publicznych
