Наследование объектов
JavaScript поддерживает наследование, позволяя нам при создании новых типов объектов при необходимости унаследовать их функционал от уже существующих. Например, у нас может быть объект User
, представляющий отдельного пользователя. И также может быть объект Employee
, который представляет работника. Но работник также может являться пользователем и поэтому должен иметь все его свойства и методы:
// конструктор пользователя
function User (name, age) {
this.name = name;
this.age = age;
this.go = function(){document.write(this.name + " идет
");}
this.displayInfo = function(){
document.write("Имя: " + this.name + "; возраст: " + this.age + "
");
};
}
User.prototype.maxage = 110;
// конструктор работника
function Employee(name, age, comp){
User.call(this, name, age);
this.company = comp;
this.displayInfo = function(){
document.write("Имя: " + this.name + "; возраст: " + this.age + "; компания: " + this.company + "
");
};
}
Employee.prototype = Object.create(User.prototype);
var tom = new User("Том", 26);
var bill = new Employee("Билл", 32, "Google");
tom.go();
bill.go();
tom.displayInfo();
bill.displayInfo();
console.log(bill.maxage);
Здесь в начале определяет конструктор User
и к его прототипу добавляется свойство maxage. Затем определяется тип Employee
. В конструкторе Employee
происходит обращение к конструктору User
с помощью вызова:
User.call(this, name, age);
Передача первого параметра позволяет вызвать функцию конструктора User
для объекта, создаваемого конструктором Employee
. Благодаря этому все свойства и методы, определенные в конструкторе User
, также переходят на объект Employee
. Кроме того, необходимо унаследовать также и прототип User
. Для этого служит вызов:
Employee.prototype = Object.create(User.prototype);
Метод Object.create()
позволяет создать объект прототипа User
, который затем присваивается прототипу Employee
. При этом при необходимости в прототипе Employee
мы также можем определить дополнительные свойства и методы.
При наследовании мы можем переопределять наследуемый функционал. Например, Employee
переопределяет метод displayInfo()
, унаследованный от User
, чтобы включить в вывод этого метода новое свойство company
.