Наследование


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]