2009-04-15 21 views
7

Ich lernte Javascript, als ich auf das Konzept des Prototyps stieß. Es ist mir gelungen, der Klasse cat neue Methoden hinzuzufügen, aber das ursprüngliche Verfahren talk konnte nicht überschrieben werden.JavaScript Prototyp-Funktion nicht überschreiben die ursprüngliche

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 alarmiert dies den neuen Text nicht?

Antwort

16

'Funktion Katze' ist nur eine Funktion. Sein Prototyp ist ein leeres Objekt ({}). 'Neue Katze' kann aufgerufen werden, um den Namen eines Mitglieds hinzuzufügen und mit einem neuen Objekt zu sprechen. 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: {} 

Nun, wenn Sie auf ‚cat.prototype.talk‘ schreiben, Sie sind Mitglieder in diesem zugrunde liegenden Objekt hinzufügen:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: { 'talk': function() {...} } 

Die ‚sprechen‘ Funktion direkt auf der Instanz ‚c‘ gesetzt nimmt Vorrang vor dem "Gespräch", das indirekt über den Konstruktorprototyp von c gesetzt wird.

Sie haben also hier zwei Arten der Vererbung, die 'this-Zuweisungsmethode' und die 'Prototyp'-Methode, durcheinandergebracht.

Das Schreiben von Methoden in Prototypen hat den Vorteil, dass keine redundanten Kopien derselben Elemente in jede Objektinstanz kopiert werden. Das Schreiben in Instanzen hat den Vorteil, dass das Problem der gebundenen Methoden gelöst wird. Welches du wählst, liegt ganz bei dir, aber mische die beiden nicht. Wenn Sie die Prototyp-Route verwenden möchten, sollte nur 'name' in 'this' geschrieben werden, da dies die einzige Eigenschaft ist, die für jede Instanz spezifisch ist.

7

Die am Anfang angehängte Funktion wird an das Objekt angehängt (1 Funktion für jede Instanz). der andere ist an den Prototyp gebunden (1 Funktion, die von allen Instanzen geteilt wird).

Elemente auf der Objektebene überschreiben diese auf der Prototypebene.

Verwandte Themen