2012-06-06 67 views
1

我想讓我的頭繞過面向對象編程中的Javascript並碰到以下問題:(這是Stoyan Stefanov的書中可以找到的簡化示例)對象在JavaScript中覆蓋原型時存在兩種狀態

我創建一個構造函數來創建狗對象:

function Dog(){ 
this.tail = true; 
} 

然後我實例使用犬構造函數的對象:

var benji = new Dog(); 

然後我一個新的屬性分配給犬的原型對象:

Dog.prototype.shout = 'Woof!'; 

現在,石磊同時訪問的尾巴,還有呼喊,符合市場預期。一切都很好,直到我覆蓋狗的原型:

Dog.prototype = {paw : 4}; 

現在,benji.paw變得未定義。我的問題是,benji不應該訪問新的原型對象嗎?更重要的是莫名其妙的是,當我創建狗的新實例原型對象後,被重新定義:

var lucy = new Dog(); 

lucy.paw評估爲4露西的構造函數對象定義似乎是從石磊的不同。我很困惑這裏發生了什麼,有人可以解釋JavaScript的對象的記憶模型是如何工作的嗎?謝謝。

回答

0

prototype只是一個對象。

如果你

var oldProto = Dog.prototype

您覆蓋之前

Dog.prototype = { paws: 4 }

,那麼你可以使用舊的原型對象及其子項的操作:

oldProto.teeth = true - >benji.teeth == true

+0

謝謝,直到此時才真正將原型視爲對象。 – Prathap