2009-07-09 6 views
0
function main() 
{ 
    this.one = 1; 
} 

main.prototype = { 
    display: function() 
    { 
    console.log(this.one); 
    return this; 
    } 
}; 

function addition() { 
    main.call(this); 
} 

addition.prototype = new main; 
addition.prototype.constructor = addition; 

addition.prototype = { 
    add: function(x) { 
    this.one += x; 
    return this; 
    } 
}; 

// addition.prototype.add = function(x) 
// { 
// this.one += x; 
// return this; 
// } 

display = new addition; 
display.add(3).add(5).display(); 

Si je remplace le commentaire ajouté.prototype.add par le nom de fichier addition.prototype, cela fonctionnera correctement, en enregistrant '9'. Sinon, si vous exécutez l'extrait ci-dessus, "display.add (3) .add (5) .display n'est pas une fonction" dans Firebug 1.4, Firefox 3.5.Différence d'héritage de prototype Javascript

Quelle est la différence entre les 2 segments? J'ai toujours pensé qu'ils sont les mêmes, s'il vous plaît conseiller sur la différence, ou/et comment je pourrais le faire fonctionner avec les codes commentés. Ou au moins pointez-moi sur les mots-clés que je devrais google pour, j'ai essayé de chercher dans les vains pendant des heures.

Merci.

Répondre

4

On dirait que vous écrasez prototype de parent du (principal) avec votre code:

addition.prototype = { 
    add: function(x) { 
    this.one += x; 
    return this; 
    } 
}; 

addition.prototype est maintenant un nouvel objet parce que vous venez de lui est affecté.

Quand vous faites:

addition.prototype.add = function(x) { 
this.one += x; 
return this; 
} 

Vous ajoutez une propriété à addition.prototype, de sorte que vous gardez la fonction principale display() a hérité.

Btw, d'où obtenez-vous ce code? C'est l'un des exemples les plus confus de l'héritage en JavaScript que j'ai vu.

+0

Ah, merci! Maintenant, cela a du sens. Je ne me souviens pas du premier site qui en a parlé, mais l'un des autres sites est http://www.cristiandarie.ro/asp-ajax/JavaScriptPrototypeInheritance.html Wow, parmi tous les sites que j'ai trouvés, Cela semble être le plus simple à suivre car je ne suis pas sûr de ce qui est la meilleure pratique, avez-vous des sites à recommander pour la meilleure pratique de cet héritage prototypique? –

+0

Je crois que Chu est correct: addition.prototype = ... coupe définitivement votre pointeur sur le prototype principal que vous avez créé plus tôt pour que l'affichage ne soit plus disponible. Je suis également d'accord que l'exemple est étrange. Tout d'abord, draco S'IL VOUS PLAÎT utiliser des lettres majuscules pour les constructeurs de fonctions pour signifier aux autres qu'ils doivent utiliser «nouveau» lors de l'appel. Si je dis accidentellement: m = main(), je viens de claquer l'espace de noms global! Il y a beaucoup d'autres problèmes réels avec le modèle classique (mutilé comme il est). S'il vous plaît regardez mes exemples ici: http://github.com/roblevintennis/Testing-and-Debugging-JavaScript – Rob

Questions connexes