MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Tworzenie hierarchii

 

Tworzenie hierarchii

Istnieje kilka sposobów zdefiniowania odpowiednich funkcji konstruktora do zaimplementowania hierarchii Pracownik. To w jaki sposób zdecydujesz się je zdefiniować zależy głównie od tego, co chcesz zrobić w swojej aplikacji.

Ten fragment pokazuje jak użyć prostych (i stosunkowo mało elastycznych) definicji w celu zademonstrowania dziedziczenia. W tych definicjach nie możesz określić żadnych wartości własności podczas tworzenia obiektu. Nowo utworzony obiekt po prostu otrzymuje wartości domyślne, które możesz zmienić później. Rysunek 8.2 ilustruje hierarchię wraz z tymi prostymi definicjami.

W prawdziwej aplikacji zdefiniowałbyś prawdopodobnie konstruktory, które pozwoliłyby Ci na zapewnienie własnościom wartości w czasie tworzenia obiektu (zobacz więcej elastycznych konstruktorów, aby uzyskać więcej informacji). Na chwilę obecną te proste definicje zademonstrują jak objawia się dziedziczenie.

Grafika:hier02.png
Rysunek 8.2: Definicje obiektu Pracownik

Poniższe definicje obiektu Pracownik w Javie i JavaScripcie są podobne. Różnią się one jedynie tym, że w Javie musisz określić typ każdej własności (w przeciwieństwie do JavaScriptu) oraz musisz stworzyć wyraźną metodę konstruktora dla klasy Javy.

</tr>

JavaScript Java
function Pracownik () {
this.imie = "";
this.dept = "ogólny";
}
public class Pracownik {
   public String imie;
   public String dept;
   public Pracownik () {
      this.imie = "";
      this.dept = "ogólny";
   }
}

Definicje Manager i Robotnik pokazuję różnicę w sposobie określania następnego obiektu wyższego w łańcuchu dziedziczenia. W JavaScripcie dodajesz instancję prototypową jako wartość własności prototypu funkcji konstruktora. Możesz do zrobić w dowolnej chwili po zdefiniowaniu konstruktora. W Javie określasz superklasę wewnątrz definicji klasy. Nie możesz zmienić superklasy spoza definicji klasy.

</tr>

JavaScript Java
function Manager () {
this.raporty = [];
}
Manager.prototype = new Pracownik;

function Robotnik () {
this.projekty = [];
}
Robotnik.prototype = new Pracownik;
public class Manager extends Pracownik {
   public Employee[] raporty;
   public Manager () {
      this.raporty = new Pracownik[0];
   }
}

public class Robotnik extends Pracownik {
   public String[] projekty;
   public Robotnik () {
      this.projekty = new String[0];
   }
}

Definicje Inzynier i Sprzedawca tworzą obiekty, które pochodzą od Robotnik a stamtąd od Pracownik. Obiekt tych typów posiada własności wszystkich obiektów znajdujących się ponad nim w łańcuchu. W dodatku definicje te nadpisują dziedziczoną własność dept nowymi wartościami specyficznymi dla tych obiektów.

JavaScript Java
function Sprzedawca () {
   this.dept = "sprzedaż";
   this.przydzial = 100;
}
Sprzedawca.prototype = new Robotnik;

function Inzynier () {
   this.dept = "inżynieria";
   this.maszyna = "";
}
Inzynier.prototype = new Robotnik;
public class Sprzedawca extends Robotnik {
   public double przydzial;
   public Sprzedawca () {
      this.dept = "sprzedaż";
      this.przydzial = 100.0;
   }
}

public class Inzynier extends Robotnik {
   public String maszyna;
   public Inzynier () {
      this.dept = "inżynieria";
      this.maszyna = "";
   }
}

Używając tych definicji możesz stworzyć instancje tych obiektów, których własności otrzymują domyślne wartości. Rysunek 8.3 ilustruje zastosowanie tych definicji JavaScriptu do zdefiniowania nowych obiektów i pokazuje wartości własności nowych obiektów.

Uwaga: Termin instancja posiada określone techniczne znaczenie w językach opartych na klasach. W językach tych instancja jest pojedynczą składową klasy i jest całkowicie różna od klasy. W JavaScripcie "instancja" nie ma takiego technicznego znaczenia, ponieważ JavaScript nie posiada tej różnicy między klasami a instancjami. Jednak, mówiąc o JavaScripcie, "instancja" może być użyta nieformalnie w znaczeniu obiektu utworzonego za pomocą konkretnej funkcji konstruktora. Dlatego w tym przykładzie mógłbyś nieformalnie stwierdzić, że janina jest instancją Inzynier. Podobnie chociaż terminy rodzic, dziecko, przodek i potomek nie mają formalnego znaczenia w JavaScripcie, możesz użyć ich nieformalnie, aby odnieść się do obiektów znajdujących się wyżej lub niżej w łańcuchu prototypu.

Grafika:hier03.png
Rysunek 8.3: Tworzenie obiektów z prostymi definicjami

Autorzy i etykiety dokumentu

 Autorzy tej strony: teoli, Mgjbot, Diablownik, Ptak82
 Ostatnia aktualizacja: teoli,