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

Что такое прототип?

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

Как мы можем добиться объектно-ориентированного поведения с помощью цепочки прототипов?

Мы можем добиться такого же объектно-ориентированного поведения в javascript, используя прототипное наследование. Прототип может содержать методы, и эти методы доступны для всех других объектов, связанных с этим прототипом. Давайте разберемся на следующем примере.

Всякий раз, когда мы создаем экземпляр класса, свойство экземпляра «__proto__» устанавливается на то, что содержится внутри свойства «прототип» самого класса. Таким образом, в примере кода экземпляры «james» и «daniel» получают доступ к методу age, определенному в прототипе Student, даже если экземпляры не содержат метод age, они все еще могут получить к нему доступ, используя наследование прототипа.

На изображении выше показана цепочка прототипов, объект является родителем всех объектов, созданных в javascript. Цепочка прототипов заканчивается, когда свойство _ _proto_ _ объекта имеет значение null, что означает, что вы достигли наивысшего объекта в цепочке прототипов, который сам является Object.

Что происходит за кулисами, когда мы используем ключевое слово «класс»?

Ключевое слово class было добавлено в JavaScript с выпуском ES6 в 2015 году. Целью этого было упростить переход для разработчиков, которые использовали JavaScript после работы с другими объектно-ориентированными языками. Это просто синтаксический сахар для реализации наследования прототипов за кулисами в javascript.

Приведенный выше фрагмент кода показывает, как класс создается с использованием ключевого слова «класс», но, как мы уже знаем, все, что он делает, — это добавляет функции конструктора и возраста к свойству «прототип» класса Student. Когда создается новый экземпляр класса, он может получить доступ ко всей информации. Последняя строка в коде подтверждает эту связь, так как будет напечатано «true».

Является ли JavaScript действительно объектно-ориентированным языком?

Вы всегда можете обсудить этот вопрос. Но в конечном итоге все сводится к поддержке четырех столпов объектно-ориентированного поведения: наследования, абстракции, полиморфизма и инкапсуляции. На мой взгляд, javascript неплохо имитирует такое поведение с помощью цепочки прототипов. Итак, я считаю, что это объектно-ориентированный язык.

Теперь вы знаете, откуда берутся все методы массива при создании нового массива. Просто чтобы подтвердить это, вы можете создать массив и попытаться получить доступ к его свойству «__proto__», и вы увидите все перечисленные там методы массива.