В JavaScript прототип — это объект, от которого наследуется другой объект.

Когда я использовал console.log() для объекта в консоли браузера, я впервые столкнулся со словом «прототип» в JavaScript.

Увидев свои собственные свойства, которые я целенаправленно создал, я продолжил отладку. Поскольку я этого не сделал и предположил, что это как-то связано с языком и пока не стоит о нем беспокоиться, я полностью проигнорировал объект-прототип, который отображался в консоли.

С этой проблемой сталкивается каждый, кто имеет опыт объектно-ориентированного проектирования на основе классов, где классы четко определены вместе с их атрибутами и функциями.

Но JavaScript отличается от языков, основанных на классах. Язык JavaScript, основанный на прототипах, имеет очень динамичную природу.

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

Вы можете поверить, что в JavaScript уже используется ключевое слово class из ES2015, но классы в JavaScript по-прежнему работают по модели, основанной на прототипах.

Однако теперь, когда JavaScript широко используется для разработки интерфейсов и серверов, для нас крайне важно понять языковые особенности прототипа и цепочки прототипов в JavaScript.

В нашей последней части мы рассмотрели многочисленные подходы к созданию объекта JavaScript.
Ознакомьтесь со статьей, нажав на эту ссылку: Создание объектов с помощью JavaScript.

Что такое прототип и цепочка прототипов в JavaScript, будет объяснено в этом посте.

Прототип

В JavaScript прототип — это объект, от которого наследуется другой объект.

В языках на основе классов класс является контейнером для всех методов и атрибутов, которые были определены для класса.

Общедоступные методы и атрибуты, определенные внутри класса, доступны для вновь сформированного объекта при создании объекта класса.

Прототип и класс, служащий моделью для объектов JavaScript, очень похожи.

В дополнение к своим собственным свойствам и методам вновь созданный объект JavaScript имеет доступ ко всем свойствам и методам прототипа, из которого он был создан.

Из-за динамической природы JavaScript мы также можем динамически добавлять свойства к объекту-прототипу. Это повлечет за собой добавление свойства или поведения к базовому классу во время выполнения, чтобы свойства, динамически добавляемые к объекту-прототипу, были доступны для всех вновь созданных объектов.

function Student(name,age)
    this.name = name;
    this.age = age;


let student1 = new Student('John',32)
let student2 = new Student('Mary',32)

console.log(student1);
console.log(student2);

student1.sports = 'Cricket';

Student.prototype.gender = null

let student3 = new Student('Shailesh',26)

Цепочка прототипов

JavaScript использует прототипы в качестве механизма наследования. Прототип предмета также будет включать в себя реальную вещь. Это продолжается до тех пор, пока на верхнем уровне больше не будет объекта-прототипа.

В JavaScript это называется цепочкой прототипов или цепочкой прототипов.

Определенные свойства объектов-прототипов также доступны для экземпляра объекта. И именно по этой причине мы можем получить доступ к атрибутам, которые мы явно не определили для объекта, поскольку они доступны через наследование через цепочку прототипов.

Каждый раз, когда мы пытаемся получить доступ к свойству объекта, сначала проверяется собственное свойство объекта.

Если свойство отсутствует в собственном свойстве, оно сканируется в объекте-прототипе. Это продолжается до тех пор, пока не будет получен запрошенный атрибут или цепочка прототипов не завершится неопределенным результатом.

Эффекты производительности от объединения прототипов

Общее время поиска свойства, которое находится на более высоком уровне цепочки прототипов, может отрицательно сказаться на производительности в коде, где производительность имеет первостепенное значение из-за различных уровней цепочки прототипов.

Кроме того, могут быть случаи, когда мы пытаемся найти свойство, которое не существует, но, поскольку свойство должно быть найдено в цепочке прототипов, пока мы не дойдем до конца, мы рискуем потерять время в процессе поиска.

Функция function hasOwnProperty(), которую все объекты наследуют от Object.prototype, чтобы ограничить поиск определенным уровнем, может использоваться для предотвращения таких обстоятельств.

Имя искомого свойства передается функции hasOwnProperty(), которая затем возвращает значение true или false в зависимости от того, было ли свойство найдено или нет.

Имейте в виду, что свойства объекта JavaScript доступны так же, как и его функции.

function Student(name,age)
    this.name = name;
    this.age = age; 


const student = new Student('Shailesh',32)
console.log(student)

Объект-прототип конструктора функции Student Object(), у которого также есть объект-прототип, унаследованный от конструктора функции Object(), который не имеет объекта-прототипа, поскольку Object является верхним уровнем цепочки прототипов, является первым уровнем цепочки прототипов, как показано на изображении выше.
Используя Object.getPrototypeOf или свойство proto экземпляра объекта, мы можем получить прототип экземпляр объекта (obj)

Для получения прототипа объекта ученика в приведенном выше примере можно использовать следующие методы:

  1. Object.getPrototypeOf(студент)
  2. студент.__proto__
  3. Student.prototype

Все предыдущие операторы будут давать один и тот же вывод при выполнении в консоли, но если мы попробуем Object.getPrototypeOf(Student) в консоли, вывод будет другим. Вместо студента экземпляра объекта Tt вернет прототип функции студента Object() [собственный код].

Я надеюсь, что у вас есть базовое понимание –

  1. Чем объектно-ориентированный дизайн на основе классов отличается от JavaScript.
  2. Опишите прототип.
  3. Что означает цепочка прототипов JavaScript или цепочка прототипов?
  4. Эффекты производительности от объединения прототипов

Надеюсь, вам понравится этот контент, и он поможет вам узнать Что такое прототип и цепочка прототипов в JavaScript
Если вам нравится этот контент, поделитесь им.

https://www.codesolutionstuff.com/what-is-prototype-and-prototype-chaining-in-javascript/

Изучите разработку полного стека — CodeSolutionStuff