Wrz
13
2015

Obiektowość w Javascript

Javascript jest językiem programowania bez ścisłej kontroli typów i nie wymaga rzutowania. Podczas pisania programu tworzone zmienne oraz funkcje można śmiało nazwać obiektami gdyż możemy wykonywać na nich metody, odwoływać się do nich będąc w ich zasięgu. W odróżnieniu od języków takich jak C++ lub PHP, Javascript nie posiada pojęcia klasy, a tradycyjne dziedziczenie oparte na hierarchii klas zostało zastąpione tzw. dziedziczeniem prototypowym.

Aby przedstawić pseudoklasyczne tworzenie klasy w Javascripcie, utworzona zostanie funkcja Ssak, która działaniem odpowiadać będzie zwykłej klasie:

  1. var Ssak = function(nazwa) {
  2. this.nazwa = nazwa;
  3. };

 

W ten sposób definiowana zmienna jest funkcją, na podstawie której możemy tworzyć obiekty. Warto zauważyć, że sama w sobie nie jest klasą tylko obiektem. Przyjmuje ona jeden argument nazwa, który jest przypisywany do tworzonego obiektu.

var Królik = new Ssak(„tuptuś”);

Stworzony został obiekt Królik, który posiada wbudowaną metodę nazwa , zawierająca nazwę stworzonego obiektu. W celu rozbudowania prototypu funkcji Ssak, która umożliwi zwrócenie takich właściwości obiektu jak nazwa należy dodać do prototypu Ssak funkcję:

  1. Ssak.prototype.dajNazwe = function() {
  2. console.log(this.nazwa);
  3. }

W powyższym przykładzie prototyp funkcji Ssak otrzymał nową metodę, która jest dostępna wśród wszystkich obiektów stworzonych na podstawie tej funkcji. Wywołanie funkcji z poniższego przykładu zwróci nam imię Ssaka:

  1. Krolik.dajNazwe(); //wyświetli “tuptuś”

 Prototyp zmiennej Krolik zawiera referencję do prototypu na podstawie którego została utworzona dzięki czemu po dodaniu metody prototypu do Ssak, wszystkie metody utworzone w tym prototypie są od razu widoczne w każdej instancji tworzonego prototypu.

Dziedziczenie prototypowe w Javascripcie polega na przypisaniu do właściwości prototype klasy dziedziczącej obiektu klasy rodzica. Dzięki takiemu zachowaniu obiektów, wszystkie prototypowe właściwości i metody rodzica, widoczne będą także w klasie pochodnej. Aby stworzyć klasę pochodną Pies, która dziedziczy własciwości po klasie Ssak należy utworzyć funkcję, a w niej wywołać funkcję call()1, która wywoła konstruktor rodzica.

  1. var Pies = function(name,wiek) {
  2. Ssak.call(this,name);
  3. this.wiek = wiek;
  4. }

W celu poprawnego odziedziczenia właściwości rodzica, do klasy pochodnej należy przypisać prototyp klasy po której dziedziczymy:

  1. Pies.prototype = Object.create(Ssak.prototype);

a także konstruktor pochodnej klasy, który będzie wskazył na konstruktor klasy Pies

  1. Pies.prototype.constructor = Pies;

Po wykonaniu powyższych linijek w pamięci silniku Javascript, został utworzony nowy obiekt Pies na podstawie, którego możemy tworzyć nowe obiekty, dodawać nowe metody do prototypu, a także nawet po nim dziedziczyć.

  1. // Dodajemy metodę „dajWiek”
  2. Pies.prototype.dajWiek = function(){
  3. alert(„mam „ + this.wiek + ” lat(a)”);
  4. };
  5. // Przykład użycia:
  6. var chihuahua = new Pies(„Alex”, 3);
  7. chihuahua.dajNazwe(); // „Alex”
  8. chihuahua.dajWiek(); // „mam 3 lat(a)”
  9. // sprawdzamy poprawność‡ działania „instanceof”
  10. alert(chihuahua instanceof Ssak); // true
  11. alert(chihuahua instanceof Pies); // true

Dzięki zastosowaniu modelu dziedziczenia prototypowego obiekt chihuahua ma dostęp do metody dajNazwe() która zwraca oczekiwany wynik czyli przypisaną właściwość name do wywołanej instancji, która została utworzona przez konstruktor obiektu.

Powiązane wpisy

Autor wpisu:

Jakub Kądzielawa - młodszy programista PHP, student Informatyki, który łączy pracę ze swoją pasją. Czasami narzeka na brak wolnego czasu.

Zostaw komentarz