В чем разница между prototype и __proto__ в JavaScript?
1️⃣ Как кратко ответить
prototype — это свойство функций-конструкторов, которое используется для добавления свойств и методов, доступных всем экземплярам, созданным этой функцией. __proto__ — это внутреннее свойство объектов, указывающее на прототип, из которого объект был создан, и используется для поиска свойств и методов в цепочке прототипов.
2️⃣ Подробное объяснение темы
В JavaScript прототипное наследование играет ключевую роль в создании объектов и их взаимодействии. Два важных понятия в этой области — это prototype и __proto__.
prototype
prototype — это свойство, которое принадлежит функциям-конструкторам. Когда вы создаете функцию-конструктор, JavaScript автоматически добавляет ей свойство prototype. Это свойство является объектом, который содержит свойства и методы, которые будут унаследованы всеми экземплярами, созданными этой функцией.
Пример:
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
return `Hello, my name is ${this.name}`;
};
const alice = new Person('Alice');
console.log(alice.greet()); // Вывод: Hello, my name is Alice
Person— это функция-конструктор.Person.prototype— это объект, на который ссылаются все экземплярыPerson.- Метод
greetдобавляется вPerson.prototype, и поэтому доступен всем экземплярамPerson.
__proto__
__proto__ — это внутреннее свойство каждого объекта, которое указывает на прототип, из которого объект был создан. Это свойство используется JavaScript для поиска свойств и методов в цепочке прототипов, если они не найдены в самом объекте.
Пример:
const bob = new Person('Bob');
console.log(bob.__proto__ === Person.prototype); // Вывод: true
bob— это объект, созданный с помощью конструктораPerson.bob.__proto__указывает наPerson.prototype, что позволяетbobиспользовать методы, определенные вPerson.prototype.
Зачем это нужно
- Наследование: Прототипное наследование позволяет объектам наследовать свойства и методы от других объектов, что способствует повторному использованию кода.
- Оптимизация памяти: Методы, определенные в
prototype, не копируются для каждого экземпляра, а хранятся в одном месте, что экономит память.
Как это работает
Когда вы вызываете метод на объекте, JavaScript сначала ищет этот метод в самом объекте. Если метод не найден, он переходит к __proto__ и ищет в прототипе. Этот процесс продолжается по цепочке прототипов до тех пор, пока метод не будет найден или не будет достигнут конец цепочки.
Важные замечания
__proto__— это не стандартное свойство, а исторически сложившееся. Для работы с прототипами рекомендуется использоватьObject.getPrototypeOfиObject.setPrototypeOf.prototypeиспользуется только у функций-конструкторов, тогда как__proto__присутствует у всех объектов.
Таким образом, prototype и __proto__ играют разные роли в механизме прототипного наследования в JavaScript, обеспечивая гибкость и эффективность в управлении объектами и их свойствами.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться