我一直在用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的控制台中完成的。
为什么如果所有新对象都包含对创建函数的原型的引用,fido.prototype是未定义的?
2)继承链是 [obj] -> [constructor] -> [prototype] 而不是 [obj] -> [prototype] 吗?
3) 我们的对象(fido)的原型属性有被检查过吗?如果有的话...为什么在最后一部分中 deathBite 没有定义?