Jeśli zrobiłeś już programowanie obiektowe w JavaScript, wiesz, że możesz utworzyć klasę w następujący sposób:
Person = function(id, name, age){
this.id = id;
this.name = name;
this.age = age;
alert('A new person has been accepted');
}
Jak dotąd osoba z klasy ma tylko dwie właściwości i zamierzamy podać jej kilka metod. Prostym sposobem na to jest użycie obiektu „prototypu”. Począwszy od JavaScript 1.1, obiekt prototypowy został wprowadzony w JavaScript. Jest to obiekt wbudowany, który upraszcza proces dodawania niestandardowych właściwości i metod do wszystkich wystąpień obiektu. Dodajmy 2 metody do naszej klasy, używając jej obiektu „prototyp” w następujący sposób:
Person.prototype = {
wake_up: function() {
alert('I am awake');
},
get_age: function() {
return this.age;
}
}
Teraz zdefiniowaliśmy naszą klasę Person. A co by było, gdybyśmy chcieli zdefiniować inną klasę o nazwie Manager, która dziedziczy niektóre właściwości z Person. Nie ma sensu ponownie definiować wszystkich tych właściwości, kiedy definiujemy naszą klasę Manager, możemy po prostu ustawić ją tak, aby dziedziczyła z klasy Person. JavaScript nie ma wbudowanego dziedziczenia, ale możemy użyć następującej techniki do zaimplementowania dziedziczenia:
Inheritance_Manager = {};
// Tworzymy klasę menedżera dziedziczenia (nazwa jest dowolna)
Teraz dajmy naszej klasie dziedziczenia metodę o nazwie extension, która przyjmuje argumenty baseClass i subClassas. W ramach metody rozszerzania utworzymy klasę wewnętrzną o nazwie inheritance function inheritance () {}. Powodem, dla którego używamy tej klasy wewnętrznej, jest uniknięcie pomyłki między prototypami baseClass i subClass. Następnie sprawiamy, że prototyp naszej klasy dziedziczenia wskazuje na prototyp baseClass, tak jak w następującym kodzie: inheritance.prototype = baseClass. prototyp; Następnie kopiujemy prototyp dziedziczenia do prototypu podklasy w następujący sposób: subClass.prototype = new inheritance (); Następną rzeczą jest określenie konstruktora dla naszej podklasy w następujący sposób: subClass.prototype.constructor = subClass; Po zakończeniu naszego prototypowania podklasy możemy określić następne dwa wiersze kodu, aby ustawić wskaźniki klasy bazowej.
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
Oto pełny kod naszej funkcji rozszerzającej:
Inheritance_Manager.extend = function(subClass, baseClass) {
function inheritance() { }
inheritance.prototype = baseClass.prototype;
subClass.prototype = new inheritance();
subClass.prototype.constructor = subClass;
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
}
Teraz, gdy zaimplementowaliśmy nasze dziedziczenie, możemy zacząć używać go do rozszerzania naszych klas. W tym przypadku zamierzamy rozszerzyć naszą klasę Person na klasę Manager w następujący sposób:
Definiujemy klasę Manager
Manager = function(id, name, age, salary) {
Person.baseConstructor.call(this, id, name, age);
this.salary = salary;
alert('A manager has been registered.');
}
sprawiamy, że dziedziczymy po osobie
Inheritance_Manager.extend(Manager, Person);
Jeśli zauważyłeś, właśnie wywołaliśmy metodę rozszerzoną naszej klasy Inheritance_Manager i przekazaliśmy Menedżera podklasy w naszym przypadku, a następnie osobę baseClass. Zwróć uwagę, że kolejność jest tutaj bardzo ważna. Jeśli je zamienisz, dziedziczenie nie będzie działać tak, jak zamierzałeś, jeśli w ogóle. Zauważ również, że będziesz musiał określić to dziedziczenie, zanim będziesz mógł faktycznie zdefiniować naszą podklasę. Teraz zdefiniujmy naszą podklasę:
Możemy dodać więcej metod, jak ta poniżej. Nasza klasa Manager zawsze będzie miała metody i właściwości zdefiniowane w klasie Person, ponieważ dziedziczy po niej.
Manager.prototype.lead = function(){
alert('I am a good leader');
}
Aby to przetestować, stwórzmy dwa obiekty, jeden z klasy Person i jeden z odziedziczonej klasy Manager:
var p = new Person(1, 'Joe Tester', 26);
var pm = new Manager(1, 'Joe Tester', 26, '20.000');
Zapraszam do uzyskania pełnego kodu i dodatkowych komentarzy pod adresem :
http://www.cyberminds.co.uk/blog/articles/how-to-implement-javascript-inheritance.aspx