2012-06-06 32 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