JavaScript использует наследование на основе прототипов. Каждый объект имеет prototype
, и когда вызывается метод объекта, JavaScript пытается найти правильную функцию для выполнения из объекта-прототипа.
Без использования объекта-прототипа мы можем определить объект Person следующим образом:
function Person(name, age)
{
this.name = name;
this.age = age;
function describe()
{
return this.name + ", " + this.age + " years old.";
}
}
При создании экземпляров Person
объекта мы создаем новую копию всех членов и методов функций. Это означает , что каждый экземпляр объекта будет иметь свои собственные name
и age
свойства, а также свою собственную describe
функцию.
Однако, если мы используем объект и назначим ему функцию, он также будет работать.Person.prototype
function Person(name, age)
{
this.name = name;
this.age = age;
}
Person.prototype.describe = function()
{
return this.name + ", " + this.age + " years old.";
}
При создании экземпляров Person
объекта они не будут содержать копию describe
функции. Вместо этого при вызове метода объекта JavaScript попытается разрешить describe
функцию сначала из самого объекта, а затем с использованием его prototype
атрибута.
Допустим, мы хотим создать Person
объект и Student
объект, производный от Person
:
var Person = function() {};
Person.prototype.initialize = function(name, age)
{
this.name = name;
this.age = age;
}
Person.prototype.describe = function()
{
return this.name + ", " + this.age + " years old.";
}
var Student = function() {};
Student.prototype = new Person();
Student.prototype.learn = function(subject)
{
console.log(this.name + " just learned " + subject);
}
var me = new Student();
me.initialize("John", 25);
me.learn("Inheritance");
Как мы видим в этом примере, initialize
метод принадлежит Person
и learn
метод принадлежит Student
, оба из которых теперь являются частью me
объекта.
Имейте в виду, что в JavaScript есть много способов наследования, и это лишь один из них.
Создайте объект, называемый Teacher
производным от Person
класса, и реализуйте вызываемый метод, teach
который получает вызываемую строку subject
и распечатывает:
[teacher's name] is now teaching [subject]