JS: Прототипы
Теория: Прототипы
В JavaScript почти каждый объект связан с прототипом. Это базовый механизм наследования в языке.
Обычно он скрыт за синтаксисом классов, но именно прототипная модель объясняет, откуда берутся методы и как работает поиск свойств.

Откуда у объекта методы, которых нет в нем самом
toString и valueOf работают, хотя в собственных свойствах объекта их нет.
Ответ: эти методы лежат в прототипе.
Как получить прототип
Внутри движка это связывается через внутренний слот [[Prototype]].
Как идет поиск свойства
Когда вы пишете obj.name, движок делает примерно так:
- ищет
nameв самом объекте - если не найдено, идет в прототип
- повторяет подъем по цепочке
- если цепочка закончилась (
null), возвращаетundefined
Упрощенная версия:
Связь функций, prototype и new
У функции-конструктора есть свойство prototype. При new F() созданный объект линкуется именно с F.prototype.
Это и есть фундамент "классового" поведения в JS.
Изменение прототипа и перекрытие
Если добавить свойство в F.prototype, его увидят все объекты, связанные с этим прототипом.
Если задать свойство напрямую в конкретном объекте, оно перекроет одноименное свойство из прототипа.
Это важно понимать, чтобы не получать неочевидные побочные эффекты при изменении общей прототипной области.
Итоги
Прототип в JavaScript не экзотика, а центральный механизм модели объектов.
Если вы понимаете цепочку прототипов, то лучше понимаете и классы, и наследование, и поведение instanceof, и причину многих "странностей" языка.