PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

В чем разница между свойствами __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.

Другие вопросы раздела