← Назад ко всем вопросам

В чем разница между 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, обеспечивая гибкость и эффективность в управлении объектами и их свойствами.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки