在javascript中覆盖原型时,对象以两种状态存在

Object exists in two states when overwriting prototype in javascript

本文关键字:对象 两种 状态 存在 javascript 覆盖 原型      更新时间:2023-09-26

我试图了解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的对象记忆模型是如何工作的吗?谢谢。

prototype只是一个对象。

如果你这样做

var oldProto = Dog.prototype

在覆盖它之前

Dog.prototype = { paws: 4 }

然后,您可以使用旧的原型对象来操作其子对象:

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