gpt4 book ai didi

javascript - 为什么重置原型(prototype)不会从对象中删除属性?

转载 作者:可可西里 更新时间:2023-11-01 02:55:14 24 4
gpt4 key购买 nike

我试图了解 javascript 原型(prototype)设计和可能的继承,但我确实遗漏了一些东西。让我们从简单的构造函数(函数 Counter())开始,添加简单的属性和对象实例化:

function Counter() { this.a = "first"; };
Counter.prototype.b = "second";
var counter = new Counter();

此时,counter.a返回“first”,counter.b返回“second”,counter.c当然是undefined 这都是可以理解的。让我们向构造函数的原型(prototype)添加另一个属性:

Counter.prototype.c = "third";  

现在,counter.c 将返回“third”。但是......我们改变了主意,让我们摆脱这些属性:

Counter.prototype = {};

使用简单的逻辑,在覆盖 counter 原型(prototype)的 prototype 属性时,我们将丢失我们之前添加到 Counter 的 counter 的属性。原型(prototype)。但事实并非如此 - counter.c 返回“third”。我在这里迷路了。所以...让我们尝试覆盖该值:

Counter.prototype.c = "fourth hohoho";

没有任何变化,counter.c 仍然返回“third”。

为什么删除属性没有成功?我错过了什么?

最佳答案

当您创建对象时,对其原型(prototype)对象的引用会添加到原型(prototype)中。

您可以扩充该原型(prototype)对象,并且因为实例共享引用,所以这些更改将反射(reflect)在任何现有实例中。

但是,如果您覆盖原型(prototype)对象,之前创建的实例仍然持有对原始原型(prototype)对象的引用。

这与这段代码所发生的相同:

var a = {};
var b = a;

a.foo = 'bar'; // augment 'a'
b.foo === 'bar'; // true

a = {}; // overwrite 'a'
b.foo === 'bar'; // still true

关于javascript - 为什么重置原型(prototype)不会从对象中删除属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com