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