Przewodnik po języku JavaScript 1.5:Praca z przykładem:Tworzenie hierarchii
z Mozilla Developer Center, polskiego centrum programistów Mozilli.
[edytuj] 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.

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.
| 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";
}
}
|
</tr>
|---|
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.
| 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];
}
}
|
</tr>
|---|
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.
