爲了更好地理解它,我在js中做了一些繼承,並且發現了讓我困惑的東西。Javascript Prototypal Inheritance懷疑二
我知道當你用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] - > [構造函數] - > [prototype]而不是[obj] - > [prototype]是繼承鏈嗎?
3)是我們的對象(fido)的「原型」屬性嗎?如果是的話......爲什麼'deathBite'未定義(在最後一部分)?
謝謝!
不錯!請注意,如果您在Derived.prototype = new Base2()之後聲明瞭var x = new Derived(),您將看到'Second'。 x只是持有指向原始Derived.prototype的指針,但這並不意味着我們實際上沒有將其重定向到Base2()。指針簡單地被改變了。一點也不矛盾,安東尼說的只是澄清最後一點。看到我的例子:http://github.com/roblevintennis/Testing-and-Debugging-JavaScript/blob/master/code/objects/lib/js_inheritance.js – Rob 2009-10-29 14:53:18