1

我试图了解 Javascript 中的面向对象编程并遇到以下问题:(这是 Stoyan Stefanov 书中可以找到的简化示例)

我创建了一个构造函数来创建 Dog 对象:

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

然后我使用 Dog 构造函数实例化一个对象:

var benji = new Dog();

然后我为 Dog 的原型对象分配一个新属性:

Dog.prototype.shout = 'Woof!';

现在,正如预期的那样,benji 既可以使用尾巴,也可以使用喊叫。一切都很好,直到我覆盖了 Dog 的原型:

Dog.prototype = {paw : 4};

现在,benji.paw 变得未定义。我的问题是,benji 不应该也可以访问新的原型对象吗?更莫名其妙的是,当我在原型对象被重新定义后创建了一个新的 Dog 实例时:

var lucy = new Dog();

lucy.paw 的计算结果为 4。 lucy 的构造函数对象定义似乎与 benji 的不同。我很困惑这里发生了什么,有人可以解释一下javascript的对象内存模型是如何工作的吗?谢谢。

4

1 回答 1

0

prototype只是一个对象。

如果你这样做

var oldProto = Dog.prototype

在你覆盖它之前

Dog.prototype = { paws: 4 }

那么你可以使用旧的原型对象来操作它的子对象:

oldProto.teeth = true—> benji.teeth == true

于 2012-06-06T09:32:50.320 回答