Klasy w JS

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 class vs. funkcje konstruktora: Wprowadzenie składni class uproś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:

  1. Stwórz klasę dla obiektów ksiązka
  2. w klasie zdefiniuj właściwości które ksiązka może mieć (tytuł, ilosc stron, kategoria, autor, rok wydania)
  3. 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