Я занимаюсь некоторым наследованием в js, чтобы лучше понять его, и нашел что-то, что меня смущает.
Я знаю, что когда вы вызываете "конструкторскую функцию" с новым ключевым словом, вы получаете новый объект со ссылкой на прототип этой функции.
Я также знаю, что для того, чтобы сделать прототипное наследование, вы должны заменить прототип функции конструктора экземпляром объекта, который вы хотите быть "суперклассом".
Итак, я сделал этот глупый пример, чтобы попробовать эти понятия:
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!
(Это было сделано в консоли Firebug)
1) Почему, если все новые объекты содержат ссылку на прототип функции creator, fido.prototype - undefined?
2) Является ли цепочка наследования [obj] → [constructor] → [prototype] вместо [obj] → [prototype]?
3) является свойством 'prototype' нашего объекта (fido) когда-либо проверяемого? если так... почему "deathBite" undefined (в последней части)?
Спасибо!