Die "Funktion Katze" ist nur eine Funktion. Ihr Prototyp ist ein leeres Objekt ({}). new cat' kann aufgerufen werden, um die Mitglieder 'name' und 'talk' zu einem neuen Objekt hinzuzufügen. Unter diesem neuen Objekt befindet sich der Funktionsprototyp, der immer noch {} ist.
var c= new cat('Tiddles');
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}
Wenn Sie nun in "cat.prototype.talk" schreiben, fügen Sie diesem zugrunde liegenden Objekt Mitglieder hinzu:
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }
Die Funktion "talk", die direkt auf die Instanz "c" gesetzt wird, hat Vorrang vor der Funktion "talk", die indirekt auf den Konstruktorprototyp von c gesetzt wird.
Sie haben hier also zwei Arten der Vererbung miteinander vermischt, die "this"-Zuweisungsmethode und die "prototype"-Methode.
Das Schreiben von Methoden in Prototypen hat den Vorteil, dass Sie keine redundanten Kopien derselben Mitglieder in jede Objektinstanz kopieren müssen; das Schreiben in Instanzen hat den Vorteil, dass es das Problem der gebundenen Methoden löst. Für welche Variante Sie sich entscheiden, bleibt Ihnen überlassen, aber vermischen Sie die beiden nicht. Wenn Sie den Weg des Prototyps gehen wollen, sollte nur "name" in "this" geschrieben werden, da dies die einzige Eigenschaft ist, die für jede Instanz spezifisch ist.