#
Prototype
В JavaScript каждый объект имеет свойство prototype, которое является ссылкой на другой объект, называемый прототипом. Прототип объекта используется для наследования свойств и методов от этого прототипа.
Когда вы обращаетесь к свойству или методу объекта, JavaScript сначала ищет это свойство или метод непосредственно в самом объекте. Если свойство или метод не найдены, JavaScript будет искать их в прототипе объекта. Если свойство или метод также не найдены в прототипе, поиск будет продолжаться по цепочке прототипов до тех пор, пока либо не будет найдено нужное свойство или метод, либо не будет достигнут глобальный объект Object.prototype.
prototype - это свойство функции, которое указывает на прототип объекта, созданного этой функцией через оператор new. Когда функция вызывается с оператором new, создается новый объект, и prototype этой функции становится прототипом такого нового объекта. При этом каждый новый объект наследует свойства и методы прототипа функции.
#
Вот как это работает:
Создание функции-конструктора: Вы создаете функцию, которая будет использоваться для создания объектов определенного типа. Например:
function Person(name, age) {
this.name = name;
this.age = age;
Использование .prototype:
Вы добавляете методы и свойства к объекту .prototype функции-конструктора. Например:
Person.prototype.sayHello = function () {
console.log(`Привет, меня зовут ${this.name} и мне ${this.age} лет.`);
};
Этот метод будет доступен для всех объектов, созданных с использованием Person, так как все они будут наследовать .prototype.
Создание объектов: Теперь вы можете создавать объекты с помощью вашей функции-конструктора:
const person1 = new Person("Анна", 30);
const person2 = new Person("Иван", 25);
Использование унаследованных методов: Вы можете вызывать методы, определенные в .prototype, на созданных объектах:
person1.sayHello(); // Выводит: Привет, меня зовут Анна и мне 30 лет.
person2.sayHello(); // Выводит: Привет, меня зовут Иван и мне 25 лет.
.prototype позволяет сэкономить память, так как методы и свойства не дублируются для каждого объекта, а только ссылку на .prototype. Это также позволяет добавлять новые методы и свойства к существующим объектам этого типа, и эти изменения будут отражены во всех объектах этого типа.
Запись .prototype используется в старом синтаксисе для создания классов и наследования в JavaScript.
Таким же образом, с помощью .prototype вы можете создавать методы для структур данных (т-к они тоже объекты). Например:
Array.prototype.last = function () {
return this.length ? this.at(-1) : -1;
};
const arr = [1, 2, 3];
console.log(arr.last()); // Выводит: 3
P.S: В современном JavaScript есть более удобные способы создания классов и наследования с использованием ключевых слов class, extends и super.