Вторая форма, возможно, является лучшей формой, потому что она создает «Класс», который имеет множество функций, живущих на своем прототипе. Когда новый класс создается, новый экземпляр также получает свой прототип, установленный на то же самое. В примере класса функции живут по прототипу.
Первые примеры просто создают объект с большим количеством функций, переназначая одинаковые функции каждому объекту каждый раз, когда это необходимо.
Прототипы предпочтительнее, потому что это означает, что работа по определению «класса» выполняется только один раз. Все экземпляры имеют один и тот же прототип - поэтому можно получить мощные конструкции, такие как добавление / изменение / удаление функций, и все экземпляры увидят изменения. В первом примере вы указываете, что все они являются независимыми объектами, где можно изменить что угодно в любом случае независимо.
В конце концов, все объекты Javascript являются хеш-таблицами свойств и функций. Когда кто-то обращается к объекту через «object.something», все является значением, включая функции. Однако, когда используется обозначение вызова функции «object.foo (...)», среда выполнения пытается найти «foo» для «объекта». Если среда выполнения не может найти «foo» на «объекте», она попытается найти «foo» на прототипе «объекта». Это продолжается до тех пор, пока что-то не будет найдено или больше не останется прототипов.
Затем среда выполнения попытается вызвать передаваемые параметры «foo» и т. Д. Естественно, что вещи взрываются, если foo не функция.