javascript - 关于原型(prototype)对象及其在 Javascript 继承中的作用

标签 javascript prototypal-inheritance prototype-programming

我才刚刚开始弄乱 Javascript 继承,无法解决这个问题:

如果我运行这段代码:

function Foo(y) {
    this.y = y;
}

Foo.prototype.x = 1;

var Bar1 = new Foo(2);
var Bar2 = new Foo(3);

我希望内存中有以下“结构”: enter image description here 我在图形中搞砸了,Bar2 显然其属性“y”的值为“3”

很高兴,我可以通过运行这段代码来确认:

console.log("Prototype - x: ", Foo.prototype.x, " y: ", Foo.prototype.y);
console.log("Bar1 - x: ", Bar1.x, " y: ", Bar1.y);
console.log("Bar2 - x: ", Bar2.x, " y: ", Bar2.y);

打印:

Prototype - x: 1 y: undefined
Bar1 - x: 1 y: 2
Bar2 - x: 1 y: 3

如果我错了请纠正我,但实际情况是,当我尝试访问 Bar1 和 Bar2 对象中的属性 x 时,因为这些对象在本地没有名为 x 的属性,我得到了来自原型(prototype)链中下一个对象的属性;即他们将其引用存储在其“_ proto _”属性中的那个。

现在是我迷路的时候了,因为如果我在那个代码之后,我会像这样改变 x 的值:

Bar1.x = 10;

当我现在运行时

console.log("Prototype - x: ", Foo.prototype.x, " y: ", Foo.prototype.y);
console.log("Bar1 - x: ", Bar1.x, " y: ", Bar1.y);
console.log("Bar2 - x: ", Bar2.x, " y: ", Bar2.y);

我得到的是

Prototype - x: 1 y: undefined
Bar1 - x: 10 y: 2
Bar2 - x: 1 y: 3

而不是我所期望的:

Prototype - x: 10 y: undefined
Bar1 - x: 10 y: 2
Bar2 - x: 10 y: 3

那一刻我只能通过假设每个对象都在创建 Foo.prototype 对象的副本来解释,但是如果我运行这个

console.log(Object.is(Foo.prototype, Bar1.__proto__), Object.is(Bar1.__proto__, Bar2.__proto__));

我得到 true true,所以 Bar1 和 Bar2 正在访问同一个对象。

如果 Bar1 都是从同一个对象获取 x,为什么 Bar1 会显示不同的 x 值?

最佳答案

这一行:

Bar1.x = 10;

不改变原型(prototype)中x的值。相反,它为 Bar1 创建一个新属性 (x) 并将 10 的值分配给它。 Bar1 因此不再从其原型(prototype)继承 x,因为它现在拥有自己的属性 x

Bar2 仍然匹配,这就是它仍然匹配原型(prototype)值的原因。

关于javascript - 关于原型(prototype)对象及其在 Javascript 继承中的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450687/

相关文章:

javascript - IndexBy 数组类型的嵌套对象值

javascript - 将 javascript blob 变量下载为 mhtml

javascript - 向对象添加原型(prototype)会出现错误

javascript - 如何正确扩展 Object.prototype?

javascript - 原型(prototype)上的属性受到不同的影响

javascript - 当密码不匹配时如何在多重登录中重定向到索引页面

javascript - JS 中的 Gcloud pubsub 工作人员

JavaScript 原型(prototype)继承不起作用

javascript - 为什么 `window.console.log(this)` 不记录控制台对象?

JavaScript 原型(prototype)困惑