JavaScript поддерживает наследование посредством цепочки прототипов. Между двумя объектами создается цепочка прототипов, когда [[Prototype]] одного объекта устанавливается равным другому. Все универсальные объекты автоматически наследуются от Object.prototype. Если вы хотите, чтобы ваш объект наследовался от чего-то другого, вы можете использовать Object.create(). Чтобы добиться наследования между пользовательскими типами, вам нужно создать цепочку прототипов в конструкторе. Делая это, вы можете наследовать методы от других объектов, но вы не можете наследовать собственные свойства, используя прототипы. Чтобы наследовать собственные свойства, вы можете использовать технику кражи конструктора, просто вызывая функцию конструктора внутри вашего объекта подтипа с помощью call() или apply(). Сочетание перехвата конструктора и связывания прототипов — наиболее распространенный способ добиться наследования между пользовательскими типами в JavaScript. Эта комбинация также известна как псевдоклассическое наследование.
Я хочу поделиться с вами тремя разными способами достижения псевдоклассического наследования в JavaScript.
Наследование с помощью конструктора функций
Основной способ достижения наследования в ES5 — использование конструкторов функций.
В этом примере вы можете наглядно увидеть комбинацию кражи конструктора и цепочки прототипов.
Чтобы не потерять свойство конструктора из объекта-прототипа, мы передаем его в качестве второго аргумента в Object.create(), см. строки 20–25.
Наследование с классом
Классы пришли из ES6, они служат синтаксическим сахаром для конструкторов функций с небольшими отличиями, но в этой статье мы их не рассматриваем.
Наследование с OLOO
Шаблон OLOO открывается как Связывание объектов с другими объектами и исходит от великого учителя и автора знаменитой книги Вы еще не знаете JS Кайла Симпсона. Насколько я понимаю, Кайл Симпсон настаивает на том, что с подходом OLOO JavaScript будет делать меньше шагов для создания нового объекта по сравнению с использованием ключевого слова new.
Одна ошибка, которую вы можете обнаружить в приведенном выше примере, это строка 17, мы не можем вызвать метод init объекта Animal с ключевым словом this, this.init будет ссылаться на объект Cat, и чтобы исправить этот случай, нам нужно либо переименовать Animal.init, как это сделал я, либо явным образом вызвать Animal. .init с помощью call().
Заключение
Выберите то, что вам нравится из приведенных выше примеров, или предложите свой способ достижения того же результата. Спасибо.