PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Для чего нужен Proto?

Продвинутые темы

`__proto__` — это ссылка объекта на его прототип (`[[Prototype]]`). Через неё работает прототипное наследование: поиск свойств идёт по цепочке прототипов.

Что это

У каждого объекта есть внутренняя ссылка [[Prototype]], исторически доступная как __proto__. Она указывает на объект-прототип, от которого наследуются свойства и методы.

const animal = { eat() { return 'ест'; } };
const dog = { bark() { return 'гав'; } };

dog.__proto__ = animal; // dog наследует от animal
dog.eat();  // 'ест' — найдено в прототипе

Цепочка прототипов

Если свойство не найдено в объекте, движок идёт по __proto__ вверх — до null:

dog.__proto__.__proto__; // Object.prototype
Object.prototype.__proto__; // null — конец цепочки

Связь с prototype

При new Constructor() движок ставит instance.__proto__ = Constructor.prototype. То есть __proto__ экземпляра указывает на prototype конструктора.

Современные методы (предпочтительны)

__proto__ — устаревший геттер/сеттер. Лучше:

Object.getPrototypeOf(dog);        // прочитать прототип
Object.setPrototypeOf(dog, animal); // установить
Object.create(animal);              // создать с прототипом

Коротко для собеседования

__proto__ — ссылка объекта на его прототип ([[Prototype]]), по которой идёт поиск свойств вверх по цепочке до null. При new устанавливается instance.__proto__ = Constructor.prototype. Устаревший — вместо него используют Object.getPrototypeOf/setPrototypeOf/create.

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