Наследование прототипов

В JavaScript используется уникальная форма создания объектов и наследования, которая называется наследованием прототипов. Суть этого подхода (в отличие от классической схемы класс-объект, знакомой большинству программистов) состоит в том, что конструктор объекта может наследовать методы другого объекта, создав прототип объекта, на основе которого строятся все остальные новые объекты.

Весь этот процесс облегчается благодаря свойству prototype (это свойство есть у любой функции, а раз конструктором может стать любая функция, то это свойство есть и у конструктора). Наследование прототипов разработано для одиночного, а не для множественного наследования.

Эта форма наследования особенно сложна для понимания в том плане, что прототипы не наследуют свойства других прототипов или других конструкторов, они наследуют их от физических объектов. Приведем примеры конкретного применения свойства prototype для реализации простого наследования.


// Создание конструктора для объекта Person
function Person( name ) {
  this.name = name;
  // Вар.1 Добавление нового метода к объекту Person в конструкторе
  Person.prototype.getName = function() {
    return this.name;
  }
}

// Вар.2 Добавление нового метода к объекту Person за пределами конструктора
Person.prototype.getName = function() {
  return this.name;
}

// Создание нового конструктора объекта User
function User( name, password ) {
  // Учтите, что здесь не поддерживается постепенная
  // перегрузка-наследование, например вызов 
  // конструктора суперкласса(родительского класса)
  this.name = name;
  this.password = password;
}

// Объект User наследует все методы объекта Person
User.prototype = new Person();

// Для объекта User мы добавляем собственный метод
User.prototype.getPassword = function() {
  return this.password;
}

В данном примере наиболее важной для нас является следующая строка:

User.prototype = new Person();

Давайте разберёмся в её назначении более детально. User — это ссылка на функцию конструктора объекта User. При помощи выражения new Person() создаётся новый объект Person, использующий конструктор Person. Результат его работы присваивается в качестве значения свойству prototype конструктора User. Это означает, что при каждом выполнении выражения new User() создаётся новый объект User, обладающий всеми методами, которые были у объекта Person на момент выполнения выражения new Person().

Добавить комментарий