He estado haciendo algo de herencia en js para entenderlo mejor, y encontré algo que me confunde.Javascript Prototypal Herencia Duda II
Sé que cuando llamas una 'función de constructor' con la nueva palabra clave, obtienes un objeto nuevo con una referencia al prototipo de esa función.
También sé que para hacer una herencia prototípica debe reemplazar el prototipo de la función constructora con una instancia del objeto que quiere que sea la 'superclase'.
así lo hice este ejemplo tonto para tratar estos conceptos:
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!
(esto se hizo en la consola de Firebug)
1) ¿Por qué si todos los nuevos objetos contienen una referencia al prototipo de la función de creador, fido.prototype no está definido?
2) ¿Es la cadena de herencia [obj] -> [constructor] -> [prototipo] en lugar de [obj] -> [prototipo]?
3) ¿La propiedad "prototipo" de nuestro objeto (fido) alguna vez se ha verificado? si es así ... ¿por qué 'deathBite' no está definido (en la última parte)?
Gracias!
¡Agradable! Tenga en cuenta que si declaró var x = new Derived() DESPUÉS del Derived.prototype = new Base2(), verá 'Second'. x simplemente está sosteniendo un puntero al prototipo Derived original, pero eso no significa que, de hecho, no lo hayamos redirigido a Base2(). Los indicadores simplemente han cambiado. Nada contradictorio con lo que Anthony está diciendo, solo aclarando eso último. Vea mis ejemplos: http://github.com/roblevintennis/Testing-and-Debugging-JavaScript/blob/master/code/objects/lib/js_inheritance.js – Rob
Ah, y creo que quiso decir: __proto__ not __prototype__ – Rob
Markdown, ergh! guión bajo subrayado guión bajo subrayado subrayado – Rob