‘function cat’ - это просто функция. Его прототипом является пустой объект ({}). «Новый кот» может быть вызван для добавления членов «имя» и «говорить» к новому объекту. Под этим новым объектом будет прототип функции, который все еще {}.
var c= new cat('Tiddles');
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}
Теперь, когда вы пишете в «cat.prototype.talk», вы добавляете членов к этому базовому объекту:
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }
Функция «talk», установленная непосредственно в экземпляре «c», имеет приоритет над «talk», косвенно установленной в прототипе конструктора c.
Итак, вы смешали здесь два стиля наследования: метод присвоения this и метод prototype.
Запись методов в прототипы имеет то преимущество, что вы не получаете избыточных копий одних и тех же членов, скопированных в каждый экземпляр объекта; Преимущество записи в экземпляры состоит в том, что она решает проблему связанных методов. Какой из них вы выбираете, зависит от вас, но не смешивайте два. Если вы хотите пойти по прототипу, в «this» должно быть записано только «name», потому что это единственное свойство, характерное для каждого экземпляра.