Наследование невероятно важно в мире объектно-ориентированного программирования. В JavaScript мы используем объекты и конструкторы для создания множества связанных объектов с унаследованными характеристиками и функциональностью. Конструкторы — это общие функции JavaScript, которые используются с ключевым словом «new». В JavaScript есть два типа: встроенные конструкторы, такие как массивы и объекты, и пользовательские конструкторы, которые определяют свойства и методы для конкретных объектов. Конструкторы великолепны и могут быть очень полезными, когда нам нужен способ создать «тип» объекта, который можно использовать несколько раз без необходимости каждый раз переопределять объект! Функция Object Constructor — это соглашение о написании имен конструкторов с заглавной буквы, чтобы мы могли отличить их от обычных функций.

function Bird(genus, family) {
this.genus = genus;
this.family = family
}
let kiwi = new Bird (“Apteryx”, “Apterygidae”);
console.log(kiwi.genus); //Apteryx
console.log(kiwi.family); //Apterygidae

Кратко поговорим о наследовании. Наследование устанавливает отношение «является» между двумя объектами. В приведенном выше примере киви «является» птицей. У киви должны быть те же методы, что и у птицы, то есть объект-прототип киви должен каким-то образом включать в себя методы, наблюдаемые в объекте-прототипе Bird.

Функция «Птица()» является примером конструктора объекта. Он содержит свои собственные свойства, которые объявляются внутри себя с помощью ключевого слова «this», где «this» относится к функции Bird. Затем мы создали новый экземпляр функции Bird, передав два уникальных аргумента, и присвоили новый экземпляр объекта переменной kiwi. Киви унаследовал свойства функции Bird, но при вызове этих свойств дает уникальные результаты. Это работает, потому что экземпляр Bird наследуется от прототипа Bird. Но вот в чем загвоздка: это также подразумевает, что каждый киви наследует от одного конкретного экземпляра Bird. На самом деле мы этого не хотим, скорее, в идеале нам нужны только методы, содержащиеся в объекте-прототипе Bird. Object.create() может сделать это за нас!

Метод Object.create() может так же искусно создать наш объект киви. Это пример наследования прототипов, дающий нам простой способ настройки цепочки прототипов. Он принимает два аргумента, второй является необязательным. Первый аргумент — это объект-прототип для расширения. Во-вторых, укажите перечисляемые свойства, которые будут добавлены к вновь созданному объекту. Наконец, Object.create() возвращает новый объект с указанным объектом-прототипом и свойствами.

const Bird = {
  noise: function() {
    console.log(this.sound);
  },
  flight: function() {
    console.log(this.fly);
  }
}
const kiwi = Object.create(Bird);
kiwi.sound = ‘tweet’;
kiwi.fly = false;

const baldEagle = Object.create(Bird);
baldEagle.sound = ‘\’MERICA!’;
baldEagle.fly = true;

kiwi.noise(); // tweet
kiwi.flight(); // false
baldEagle.noise(); // ‘MERICA!
baldEagle.flight(); // true

Мы создали объект Bird, который содержит два свойства: шум, значением которого является анонимная функция, регистрирующая значение this.sound, и полет, который регистрирует this.fly. Затем мы создали экземпляр этого объекта, используя Object.create(), и присвоили ему имя переменной kiwi. Мы дали киви свои собственные уникальные свойства с помощью .sound и .fly, чтобы, когда киви вызывает свой новый унаследованный метод шума или полета, он регистрировал уникальное значение для этого вновь созданного экземпляра!

Object.create() — отличный выбор для создания объекта без использования его конструктора. Это помогает нам создавать четкие и лаконичные цепочки прототипов, в которых мы используем нашу функцию конструктора для инициализации вновь созданных объектов в контексте этой цепочки прототипов. Использование Object.create() упрощает настройку цепочек наследования, поскольку любой объект может быть передан в первый аргумент в качестве прототипа. Самым большим преимуществом является то, что Object.create() всегда будет работать! Создание нового экземпляра с использованием ключевого слова «new» работает только в том случае, если конструктор не ожидает никаких аргументов.