Warning: Invalid argument supplied for foreach() in /usr/home/nebulaus/domains/blog.nebula.us/public_html/libraries/src/Cache/Storage/FileStorage.php on line 315 ECMAScript 6: TOP 10 nowości - cz.2 - Klasy - Front End Nebula - JavaScript, HTML, CSS

Jeśli kiedykolwiek mieliście styczność z innymi językami obiektowymi, bardzo możliwe, że w programując w JavaScript doskwiera Wam brak klas. Do tej pory trzeba było kombinować z funkcjami-konstruktowami i prototypami, co czyniło składnię nieco nieczytelną. Na szczęście twórcy ES6 postanowili posłuchać woli ludu i do specyfikacji ES6 dorzucili długo oczekiwane klasy.

Klasy i konstruktory

Tworzenie klasy obiektu w ES6 jest tak proste, jak tylko można sobie wyobrazić:

class Animal {};

Sposób tworzenia obiektów danej klasy był za to już wystarczająco intuicyjny i nie uległ zmianie w stosunku do ES5:

class Animal {};
var armadillo = new Animal();
console.log(typeof armadillo);

Powyższy kod poskutkuje wypisaniem do konsoli "object", co potwierdza, że pod zmienną armadillo przechowujemy obiekt.

Jako, że każdy mały pancernik lubi, gdy woła się go po imieniu, do naszego kodu powinniśmy dodać konstruktor:

class Animal {
  constructor(name){
    this.name = name
  }
}
var armadillo = new Animal('Bogusław');
console.log(armadillo.name); // Bogusław

Dziedziczenie

Nasz pancernik Bogusław bardzo lubi dobre towarzystwo, w szczególności cietrzewi zwyczajnych. Jako, że ptaki to całkiem spora grupa zwierząt, różniąca się nieco od zwierząt lądowych, przydałoby się stworzyć dla nich osobną klasę dziedziczącą po klasie Animal. Skorzystamy w tym celu ze słowa kluczowego extends:

class Animal {
  constructor(name){
    this.name = name
  }
}

class Bird extends Animal { // dziedziczenie
    constructor(name, wingspan) {
        super(name); // wywołanie nadrzędnego konstruktora
        this.wingspan = wingspan;
    }
}

var armadillo = new Animal('Bogusław');
var blackGrouse = new Bird('Antoni', 62);
console.log(armadillo.name); //Bogusław
console.log(blackGrouse.name + ' ' + blackGrouse.wingspan); //Antoni 62

Istotne rzeczy w powyższym kodzie dzieją się w dwóch zaznaczonych linijkach.  W linii 7 następuje dziedziczenie klasy Bird po klasie Animal za pomocą słowa kluczowego extends. Dzięki temu klasa Bird ma wszystkie właściwości klasy po której dziedziczy, dodając do tego swoje własne (jak w linijce 10). 

Słowo kluczowe super służy do wywołania konstruktora klasy Animal. W rezultacie w linijce 15 możemy wywołać konstruktor podając dwa parametry - jeden zadeklarowany w klasie Animal, drugi w klasie Bird. Jest to chyba wystarczająco intuicyjne i nie wymaga głębszego tłumaczenia. No przynajmniej cietrzew Antoni mówi, że zrozumiał.

Zmienne prywatne i publiczne

To, czego niestety nie oferuje nam mechanizm działania klas w ES6 to koncept zmiennych prywatnych i publicznych. Oczywiście są sposoby na to, by i z tym poradzić sobie w JavaScript, ale nie jest to rozwiązanie tak eleganckie, jak w innych językach. Wiele wskazuje na to, że słowa kluczowe private i public trafią ostatecznie do JavaScript, ale prawdopodobnie dopiero w standardzie ES7.

A co z prototypami?

Właściwie to... nic. Wszystko, co widzicie powyżej to tylko tzw. syntatic sugar. W rzeczywistości za kulisami i tak zachodzi dziedziczenie prototypowe. ES6 daje nam jedynie kilka słów kluczowych, dzięki którym programowanie obiektowe w JavaScript ma być bardziej intuicyjne i zbliżone sładniowo do tego, co znamy z innych języków obiektowych.

Dla tych, dla których JavaScript to jedyny język, z jakim mieli styczność, klasy mogą wydać się zbędne. Nie ma wtedy problemu, by dalej korzystać z prototypów. Ja zachęcam próby zaprzyjaźnienia się z klasami - głównie ze względu na dużo większą czytelność powstałego dzięki nim kodu.