Je faisais de l'héritage dans js afin de mieux le comprendre, et j'ai trouvé quelque chose qui me rend confus.Javascript Prototype Héritage Doute II
Je sais que lorsque vous appelez une 'fonction constructeur' avec le nouveau mot-clé, vous obtenez un nouvel objet avec une référence au prototype de cette fonction.
Je sais aussi que pour faire l'héritage prototypique, vous devez remplacer le prototype de la fonction constructeur par une instance de l'objet que vous voulez être la 'superclasse'.
donc je l'ai fait exemple stupide d'essayer ces concepts:
function Animal(){}
function Dog(){}
Animal.prototype.run = function(){alert("running...")};
Dog.prototype = new Animal();
Dog.prototype.bark = function(){alert("arf!")};
var fido = new Dog();
fido.bark() //ok
fido.run() //ok
console.log(Dog.prototype) // its an 'Object'
console.log(fido.prototype) // UNDEFINED
console.log(fido.constructor.prototype == Dog.prototype) //this is true
function KillerDog(){};
KillerDog.prototype.deathBite = function(){alert("AAARFFF! *bite*")}
fido.prototype = new KillerDog();
console.log(fido.prototype) // no longer UNDEFINED
fido.deathBite(); // but this doesn't work!
(Cela a été fait dans la console de Firebug)
1) Pourquoi si tous les nouveaux objets contiennent une référence au prototype de la fonction créateur, fido.prototype est indéfini?
2) La chaîne d'héritage [obj] -> [constructeur] -> [prototype] au lieu de [obj] -> [prototype]?
3) la propriété 'prototype' de notre objet (fido) a-t-elle déjà été vérifiée? si oui ... pourquoi 'deathbite' est-il indéfini (dans la dernière partie)?
Merci!
Nice! Notez que si vous avez déclaré var x = new Derived() APRÈS le Derived.prototype = new Base2(), vous verrez 'Second'. x contient simplement un pointeur sur le Derived.prototype d'origine, mais cela ne signifie pas que nous ne l'avons pas redirigé vers Base2(). Les pointeurs ont simplement été changés. Pas du tout contredire ce qu'Anthony dit mais juste clarifier ce dernier morceau. Voir mes exemples: http://github.com/roblevintennis/Testing-and-Debugging-JavaScript/blob/master/code/objects/lib/js_inheritance.js – Rob
Oh, et je pense que vous vouliez dire: __proto__ pas __prototype__ – Rob
Markdown, Ergh! soulignement soulignement proto underscore soulignement – Rob