Краткий ликбез по JS: Как работает прототипное наследование: при обращении к свойству оно ищется сначала в самом объекте, потом, если не найдено, в том объекте, который указан как прототип (скрытое свойство [[Prototype]]
) для исходного, потом в прототипе прототипа и так далее, пока прототип не null. Что происходит, когда мы вызываем new SomeFunction()
: создается новый объект у которого [[Prototype]]
ссылается на SomeFunction.prototype
, в контексте этого нового объекта вызывается SomeFunction
(как если бы через apply или call), полученный объект возвращается.
1) В первом варианте у вас в конструкторе лишняя операция. А если таких методов 10? А если надо создать 10000 таких объектов?
2) Во первом варианте у вас каждый инстанс будет непосредственно иметь ссылку на getName. Во втором — каждый инстанс будет иметь ссылку на прототип, в котором уже будет ссылка на getName. Значит, первый вариант будет жрать поболе памяти (однако обращение к методу getName будет работать чуточку быстрее).
3) Можно так делать, если очень надо переопределить getName для данного объекта. Но с точки зрения архитектуры — не стоит, лучше создать отдельный класс или фабричную функцию, которая будет возвращать объект с нужным getName. Причина: black magic, который задолбаешься искать по коду.
4) На данный момент времени, можно, наверное, начинать писать на ES2015 с нативными классами, чтобы не придумывать велосипеды с колесами из костылей:)