В чем разница между свойствами __proto__ и prototype?
Объекты и прототипы
`prototype` — свойство функции-конструктора, а `__proto__` — ссылка на прототип у экземпляра объекта. Их часто путают, но это разные вещи.
prototype
Есть только у функций (конструкторов). Это объект, который станет прототипом для экземпляров, созданных через new.
function User(name) {
this.name = name;
}
User.prototype.greet = function () {
return `Привет, ${this.name}`;
};__proto__
Есть у любого объекта. Это ссылка на его прототип — фактически [[Prototype]].
const user = new User('Ann');
user.__proto__ === User.prototype; // trueСвязь
При new User() движок устанавливает user.__proto__ = User.prototype. Поэтому экземпляр находит greet по цепочке прототипов.
user.greet(); // ищется в user.__proto__ (= User.prototype)Современные способы
Object.getPrototypeOf(user)— вместо чтения__proto__.Object.setPrototypeOf(obj, proto)— вместо записи.
__proto__ — устаревший геттер/сеттер, но повсеместно поддерживается.
Коротко для собеседования
prototype — свойство функции-конструктора (шаблон для будущих экземпляров). __proto__ — ссылка экземпляра на его прототип. При new выполняется instance.__proto__ = Constructor.prototype. Читать прототип лучше через Object.getPrototypeOf.