proto — это свойство каждого объекта, которое указывает на его прототип (от кого он наследует свойства). prototype — это свойство функций, которое используется как прототип для новых объектов, созданных этой функцией. proto есть у всех объектов, prototype — только у функций.
Разница между proto и prototype — одна из самых запутанных тем в JavaScript. Важно понимать, что это разные вещи, которые работают по-разному.
Это свойство любого объекта, которое указывает на его прототип:
const obj = {};
console.log(obj.__proto__); // Прототип объектаЭто свойство функций, которое становится прототипом для новых объектов:
function User() {}
console.log(User.prototype); // Прототип для новых объектовconst parent = { name: 'Родитель' };
const child = Object.create(parent);
console.log(child.__proto__ === parent); // true
console.log(child.name); // 'Родитель' — через __proto__function User(name) {
this.name = name;
}
User.prototype.sayHello = function() {
return 'Привет, ' + this.name;
};
const user = new User('Иван');
console.log(user.sayHello()); // 'Привет, Иван' — метод из prototypefunction User() {}
const user = new User();
// user.__proto__ === User.prototype
console.log(user.__proto__ === User.prototype); // truefunction User() {}
User.prototype.method = function() {};
const user = new User();
// user → user.__proto__ (User.prototype) → Object.prototype → nullconst obj = {};
// Проверить прототип объекта
console.log(obj.__proto__ === Object.prototype); // truefunction Animal() {}
// Добавить метод всем будущим объектам
Animal.prototype.speak = function() {
console.log('Я животное');
};// ❌ Думаем, что они одно и то же
const obj = {};
console.log(obj.__proto__); // Прототип объекта
console.log(obj.prototype); // undefined — у объектов нет prototype
// ✅ Правильное понимание
function Func() {}
console.log(Func.prototype); // Есть только у функций// ❌ Может не работать как ожидается
function User() {}
const user = new User();
User.prototype.method = function() {};
// user может не иметь доступа к новому методу в некоторых случаях
// ✅ Лучше добавлять методы до создания объектовПонимание разницы между proto и prototype помогает лучше понимать, как работает наследование в JavaScript.
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪