Что такое __proto__ и prototype?
Этот вопрос проверяет знание различий между свойствами __proto__ и prototype, а также понимание того, как они используются для создания и управления наследованием в JavaScript.
Короткий ответ
__proto__ — это скрытое свойство каждого объекта, которое ссылается на его прототип, позволяя наследовать свойства и методы. prototype — это свойство функций-конструкторов, которое определяет прототип для всех объектов, созданных с их помощью. Когда создаётся объект с помощью конструктора, он получает ссылку на прототип через свойство __proto__, а прототип этих объектов задаётся через свойство prototype конструктора.
Длинный ответ
В JavaScript есть два связанных, но разных понятия — __proto__ и prototype.
__proto__: Это скрытое внутреннее свойство, которое присутствует у каждого объекта. Оно ссылается на прототип объекта, от которого он наследует свойства и методы. Это свойство используется для реализации механизма прототипного наследования. Через него JavaScript определяет, к какому объекту обратиться, если требуемое свойство не найдено у самого объекта.
Например:
const obj = {};
console.log(obj.__proto__); // Выведет Object.prototype__proto__ можно использовать для динамического изменения цепочки прототипов, хотя это не считается хорошей практикой из-за потенциальных проблем с производительностью.
prototype: Это свойство функций-конструкторов, которое используется для определения прототипа всех объектов, созданных с помощью этого конструктора. Если вы создаёте объект через функцию-конструктор, его скрытое свойство __proto__ будет ссылаться на объект, который определён через prototype функции-конструктора.
Пример с использованием функции-конструктора:
function Animal() {}
Animal.prototype.speak = function() {
console.log('Animal speaks');
};
const dog = new Animal();
dog.speak(); // 'Animal speaks'Здесь dog.__proto__ ссылается на Animal.prototype, что позволяет объекту dog наследовать метод speak.
Таким образом, __proto__ управляет ссылкой на прототип для любого объекта, тогда как prototype управляет тем, что будет установлено в качестве прототипа для объектов, создаваемых с помощью конструктора.