2009-04-15 4 views
7

Apprendre javascript quand je suis tombé sur le concept de prototype. J'ai réussi à ajouter de nouvelles méthodes à la classe cat mais n'a pas réussi à remplacer la méthode originale talk.Fonction de prototype JavaScript ne remplaçant pas celle d'origine

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() 

Pourquoi cela n'indique-t-il pas le nouveau texte?

Répondre

16

'fonction cat' est juste une fonction. Son prototype est un objet vide ({}). 'New cat' peut être appelé pour ajouter le nom des membres 'et' talk 'à un nouvel objet. Sous ce nouvel objet sera le prototype de la fonction, qui est toujours {}.

var c= new cat('Tiddles'); 

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

Maintenant, quand vous écrivez « cat.prototype.talk », vous ajoutez des membres à cet objet sous-jacent:

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

Le « talk » fonction situé directement sur l'instance « c » prend préséance sur l'ensemble 'talk' indirectement sur le prototype du constructeur de c. Donc, vous avez mélangé deux styles d'héritage ici, la méthode d'affectation 'this' et la méthode 'prototype'.

L'écriture de méthodes sur des prototypes présente l'avantage de ne pas obtenir de copies redondantes des mêmes membres copiés dans chaque instance d'objet; écrire aux instances a l'avantage de résoudre le problème des méthodes liées. Lequel vous choisissez est à vous, mais ne mélangez pas les deux. Si vous souhaitez utiliser la route prototype, seul 'name' doit être écrit dans 'this', car c'est la seule propriété spécifique à chaque instance.

7

La fonction attachée au début est attachée à l'objet (1 fonction pour chaque instance). l'autre est attaché au prototype (1 fonction partagée par toutes les instances).

les membres au niveau de l'objet remplacent ceux au niveau du prototype.

Questions connexes