我一直在学习 JavaScript 的继承,以便更好地理解它,但我发现了一些令我困惑的事情。
我知道当你使用 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)我们对象(fido)的“prototype”属性是否被检查过?如果是...为什么最后一部分“deathBite”未定义?