Если вы занимались объектно-ориентированным программированием на JavaScript, вы знаете, что можете создать класс следующим образом:
Person = function(id, name, age){
this.id = id;
this.name = name;
this.age = age;
alert('A new person has been accepted');
}
Пока что у нашего класса person только два свойства, и мы собираемся дать ему несколько методов. Чистый способ сделать это - использовать его объект-прототип. Начиная с JavaScript 1.1, объект-прототип был введен в JavaScript. Это встроенный объект, который упрощает процесс добавления настраиваемых свойств и методов ко всем экземплярам объекта. Давайте добавим к нашему классу 2 метода, используя его объект-прототип следующим образом:
Person.prototype = {
wake_up: function() {
alert('I am awake');
},
get_age: function() {
return this.age;
}
}
Теперь мы определили наш класс Person. Что, если бы мы хотели определить другой класс с именем Manager, который наследует некоторые свойства от Person. Нет смысла заново определять все эти свойства, когда мы определяем наш класс Manager, мы можем просто установить его для наследования от класса Person. JavaScript не имеет встроенного наследования, но мы можем использовать следующий метод для реализации наследования:
Inheritance_Manager = {};
// Создаем класс менеджера наследования (название произвольное)
Теперь давайте дадим нашему классу наследования метод под названием extend, который принимает аргументы baseClass и subClassas. Внутри метода расширения мы создадим внутренний класс, называемый функцией наследования inheritance () {}. Причина, по которой мы используем этот внутренний класс, состоит в том, чтобы избежать путаницы между прототипами baseClass и subClass. Затем мы заставляем прототип нашего класса наследования указывать на прототип baseClass, как в следующем коде: inheritance.prototype = baseClass. опытный образец; Затем мы копируем прототип наследования в прототип подкласса следующим образом: subClass.prototype = new inheritance (); Следующее, что нужно сделать, - это указать конструктор для нашего подкласса следующим образом: subClass.prototype.constructor = subClass; Закончив прототипирование нашего подкласса, мы можем указать следующие две строки кода, чтобы установить некоторые указатели базового класса.
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
Вот полный код нашей функции расширения:
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;
}
Теперь, когда мы реализовали наше наследование, мы можем начать использовать его для расширения наших классов. В этом случае мы собираемся расширить наш класс Person до класса Manager следующим образом:
Определяем класс Manager
Manager = function(id, name, age, salary) {
Person.baseConstructor.call(this, id, name, age);
this.salary = salary;
alert('A manager has been registered.');
}
мы наследуем от человека
Inheritance_Manager.extend(Manager, Person);
Если вы заметили, мы только что вызвали метод расширения нашего класса Inheritance_Manager и в нашем случае передали диспетчер подклассов, а затем - человека базового класса. Обратите внимание, что порядок здесь очень важен. Если вы поменяете их местами, наследование не будет работать так, как вы планировали, если вообще. Также обратите внимание, что вам нужно будет указать это наследование, прежде чем вы действительно сможете определить наш подкласс. Теперь давайте определим наш подкласс:
Мы можем добавить больше методов, как показано ниже. Наш класс Manager всегда будет иметь методы и свойства, определенные в классе Person, потому что он наследуется от него.
Manager.prototype.lead = function(){
alert('I am a good leader');
}
Теперь, чтобы проверить это, давайте создадим два объекта, один из класса Person и один из унаследованного класса Manager:
var p = new Person(1, 'Joe Tester', 26);
var pm = new Manager(1, 'Joe Tester', 26, '20.000');
Не стесняйтесь получить полный код и другие комментарии по адресу:
http://www.cyberminds.co.uk/blog/articles/how-to-implement-javascript-inheritance.aspx