Jeśli myśleliście, że JavaScript nie wspiera paradygmatu obiektowego, to jesteście w błędzie. Całkiem mocno pochylił się w jego stronę i to do stopnia jawnego wspierania klas. "class" w języku JavaScript istnieje i to całkiem na serio! A teraz poznajemy szczegóły!
Tweet |
"CLASS" W JĘZYKU JAVASCRIPT I WSZYSTKO JASNE!
Mały "polecony" dla czytelników znających dowolny język obiektowy :D:
Drodzy specjaliści od Javy, C# i tym podobnych języków obiektowych,
Jestem zmuszony uprzedzić niektórych z Was z racji tego, iż wyobraźnia może wprowadzić w błędne przeświadczenia. Klasy w języku JavaScript NIE SĄ tymi samymi klasami jakie widzicie w poznanych już językach! Różnią się wyglądem i składnią o wiele bardziej niż choćby Java kontra C#. Proszę o wzmożoną czujność i baczną obserwację podczas prezentowania przykładów jakie zostaną zawarte w niniejszej treści.
Pozdrawiam
Myślę, że nie muszę się powtarzać. Zaczynajmy więc!
BUDOWA KLASY
Dobra wiadomość jest taka, że jak "class" było w Javie i w "CSharpie", tak jest i w języku JavaScript:
class MyClass {
}
Klamerki też takie same definiujące "pole widzenia". Ale już konstruktor klasy definiuje się inaczej:
class MyClass {
constructor() {
// instrukcje
}
}
Znajdziecie go po słowie kluczowym "constructor" (nietrudno się domyślić...). Konstruktor to metoda klasy wywoływana w chwili tworzenia obiektu na jej podstawie. Jest to pierwsza czynność wykonywana podczas "narodzin" instancji (obiektu). Konstruktor jak to u wyżej wymienionych "kolegów", także może przyjmować parametry do późniejszej inicjalizacji:
class MyClass {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
Uwaga dla znawców innych języków! "class" w języku JavaScript nie wspiera przeciążania konstruktorów! Wtedy musicie zastosować "bypass" w postaci przekazywania obiektu jako parametru i przypisywania wartości domyślnych w przypadku nieznalezienia pożądanej wartości:
class MyClass {
constructor(values) {
this.x = values.x || 50;
this.y = values.y || 100;
this.z = values.z || 904;
}
}
itd. Niekonwencjonalne użycie operatora alternatywy do zwracania wartości wytłumaczyłem w artykule o boolowskim typie danych, więc sięgnijcie jeśli zapis jest enigmatyczny.
DANE SKŁADOWE
A dane składowe? Tak samo jak w atrybutach obiektu:
class MyClass {
constructor() {
this.x = 60;
}
}
albo tak:
class MyClass {
x = 60;
}
METODY
Metody też mogą istnieć, a kto powiedział że nie ;)? Tutaj też panuje różnica w zapisie i w tej sytuacji nie wstawiamy "function":
class MyClass {
doSomething() {
// instrukcje
}
}
tylko podajemy samą nazwę z parą nawiasów okrągłych dla potencjalnych parametrów. To jest kolejny wyjątek jakim się wyróżnia "class" w języku JavaScript. I klamerki! Klamerki to rzecz niezbędna!
Celem wywołania metody, konieczne jest utworzenie instancji obiektu, w taki sam sposób jak się to robi w innych językach obiektowych (w kolejnym nagłówku jest przykład, jeśli ktoś nie ma pojęcia).
CHCĘ ZACHOWAĆ PRYWATNOŚĆ
Składowe mogą być też prywatne. Wiecie jak to się robi?
class MyClass {
#x;
#doSomething() {
// instrukcje
}
}
Nie, nie wstawiamy żadnych modyfikatorów dostępu, jak mogliście pomyśleć! Znak "hash'a" przed nazwą "uprywatyzowuje" składową. Dotyczy to zarówno danych, jak i metod. Da to taki efekt, że nie będzie można się odwołać do składowej prywatnej na zewnątrz kodu. W żaden sposób! Ukrywanie implementacji jest istotną rzeczą dla programowania obiektowego.
PRZYKŁAD KODU ŹRÓDŁOWEGO
Przypomnijmy sobie przykład z graczem:
class Player() {
constructor() {
this.health = 100;
}
attack() {
console.log("Gracz atakuje!");
}
}
const player = new Player();
Inicjalizacja właściwości "health" odbywa się w konstruktorze klasy. Klasa przyjmuje metodę atakowania przez gracza. Poniżej jest inicjacja obiektu gracza na podstawie klasy, która jest w postaci znanej z innych języków obiektowych. Podobieństwo na pewno upraszcza naukę :)!
Klasa może zostać utworzona w języku JavaScript przy pomocy tego samego słowa jakie możemy znać z innych języków, "class"!
Artykuł nieduży, ale też i nie skandalicznie mały. Garść informacji, przykłady i sposób użycia. To wystarczy początkującym, żeby z tego skorzystać i się nie przestraszyć :D!