Современный JavaScript реализует два подхода в организации объектно-ориентированной структуры кода:
В класс-ориентированном программировании мы сначала создаем класс в качестве шаблона, а затем на его основе создаем объект. Для построения более конкретных типов объектов мы создаем потомка класса. То есть, мы вносим некоторые изменения в шаблон и используем полученный новый шаблон для построения более конкретных объектов.
Например, если нужно создать стул, мы сначала создаем проект на бумаге, и только затем - стулья на основе этого проекта. Проект здесь — класс, а стулья являются объектами.
Теперь перенесем этот пример в мир JavaScript prototype наследования: здесь не создаются проекты. Сразу берем доски и сколачиваем стул. Этот стул — реальный объект, который может функционировать в полной мере как стул, а также служить прототипом для будущих стульев. В мире прототипов из стула создаем любое количество клонов. Если надо построить кресло-качалку, тогда берам стул, изготовленный ранее и прикладываем к нему две дугообразные доски.