7 Stimmen

JavaScript-Prototyp-Funktion überschreibt nicht die ursprüngliche Funktion

Ich lernte Javascript, als ich auf das Konzept des Prototyps stieß. Es gelang mir, neue Methoden zu den Katze Klasse, scheiterte aber beim Überschreiben der ursprünglichen sprechen Methode.

function cat(name) {
    this.name = name;
    this.talk = function() {
        alert( this.name + " : I'm a girl!" )
    }
}

cat.prototype.talk = function() {
    alert( this.name + " : I'm a dude!" )
}

cat1 = new cat("felix")
cat1.talk()

Warum wird der neue Text nicht angezeigt?

16voto

bobince Punkte 512550

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.

7voto

MahdeTo Punkte 10654

Die zu Beginn angehängte Funktion ist mit dem Objekt verbunden (1 Funktion für jede Instanz). Die andere ist mit dem Prototyp verbunden (1 Funktion, die von allen Instanzen gemeinsam genutzt wird).

Mitglieder auf der Objektebene haben Vorrang vor denen auf der Prototypebene.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X