'function cat' es solo una función. Su prototipo es un Objeto vacío ({}). 'Nuevo gato' se puede llamar para agregar miembros 'nombre' y 'hablar' a un nuevo Objeto. Debajo de ese nuevo Objeto se encontrará el prototipo de la función, que sigue siendo {}.
var c= new cat('Tiddles');
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}
Ahora, cuando se escribe a 'cat.prototype.talk', está añadiendo miembros a ese objeto que subyace:
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }
La función 'hablar' situado en la misma instancia 'c' toma precedencia sobre la 'conversación' establecida indirectamente en el prototipo constructor de c.
Has mezclado dos estilos de herencia aquí, el método 'this'-assigning y el método' prototype '.
Escribir métodos para prototipos tiene la ventaja de que no se obtienen copias redundantes de los mismos miembros copiados en cada instancia de objeto; escribir en instancias tiene la ventaja de que resuelve el problema de los métodos enlazados. Cuál de ustedes elija depende de usted, pero no mezcle los dos. Si desea ir a la ruta del prototipo, solo debe escribirse 'nombre' en 'esto', porque esa es la única propiedad que es específica para cada instancia.