'function cat' è solo una funzione. Il suo prototipo è un oggetto vuoto ({}). "New cat" può essere chiamato per aggiungere "name" dei membri e "talk" a un nuovo oggetto. Sotto questo nuovo oggetto sarà il prototipo della funzione, che è ancora {}.
var c= new cat('Tiddles');
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}
Ora, quando si scrive a 'cat.prototype.talk', si stanno aggiungendo i membri di tale oggetto sottostante:
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }
La funzione di 'parlare' situato direttamente sul istanza 'c' prende precedenza sul 'talk' impostato indirettamente sul prototipo del costruttore di c.
Quindi hai mixato due stili di ereditarietà qui, il metodo di assegnazione "this" e il metodo "prototype".
Scrivere metodi per prototipi ha il vantaggio che non si ottengono copie ridondanti degli stessi membri copiate in ogni istanza di oggetto; scrivere in istanze ha il vantaggio di risolvere il problema dei metodi associati. Quello che scegli dipende da te, ma non mescolare i due. Se vuoi seguire il percorso del prototipo, solo "nome" dovrebbe essere scritto su "questo", perché questa è l'unica proprietà specifica di ogni istanza.