Что такое прототипы в JavaScript?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В JavaScript объекты могут наследовать свойства и методы от других объектов через механизм прототипов. Каждый объект в JavaScript имеет внутреннее скрытое свойство [[Prototype]], которое указывает на другой объект, являющийся его прототипом. Когда происходит обращение к свойству или методу объекта, движок JavaScript сначала ищет его в самом объекте. Если не находит, он обращается к свойству [[Prototype]] и ищет в прототипе. Этот процесс повторяется по цепочке прототипов до тех пор, пока свойство не будет найдено или пока не будет достигнут null (конец цепочки).
Основные концепции:
- Прототипная цепочка: Последовательность объектов, связанных через свойство
[[Prototype]]. - Наследование: Объекты наследуют свойства и методы своих прототипов.
__proto__: Исторически использовавшееся (хотя и не стандартизированное изначально) свойство для доступа к[[Prototype]]. Сейчас предпочитается использоватьObject.getPrototypeOf().prototype: Свойство конструктора, на которое ссылается[[Prototype]]экземпляров, созданных с помощью этого конструктора.
Пример с конструктором и прототипом:
// Конструктор
function Person(name, age) {
this.name = name;
this.age = age;
}
// Добавляем метод в прототип
Person.prototype.sayHello = function() {
console.log("Hello, my name is " + this.name);
};
// Создаем экземпляр
const person1 = new Person("Alice", 30);
// Вызываем метод из прототипа
person1.sayHello(); // Output: Hello, my name is Alice
// Доступ к прототипу экземпляра
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Output: true
В этом примере:
Person- это функция-конструктор.Person.prototype- объект, который является прототипом для всех экземпляров, созданных с помощьюnew Person().sayHello- метод, добавленный в прототип. Все экземплярыPersonнаследуют этот метод.- Когда вызывается
person1.sayHello(), движок JavaScript ищетsayHelloвperson1. Не найдя, он обращается к[[Prototype]]person1(который равенPerson.prototype) и находит метод там.
Прототипы обеспечивают эффективное использование памяти, так как методы и общие свойства хранятся в прототипе, а не дублируются в каждом экземпляре объекта.