Javascript 为什么重置prototype不会从对象中移除属性?

Javascript 为什么重置prototype不会从对象中移除属性?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我试图了解javascript原型&可能的继承,但我肯定遗漏了一些东西。让我们从简单构造函数(function Counter())开始,添加简单属性和对象实例化: function Counter() { this.a = "first"; }; Counter.prototype.b = "second"; var counter = new Counter(); 此时,counter.a返回“first”,而counter.b返回“second”,而counter.c当然是未定义的,这是

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

function Counter() { this.a = "first"; };
Counter.prototype.b = "second";
var counter = new Counter();
此时,
counter.a
返回“first”,而
counter.b
返回“second”,而
counter.c
当然是
未定义的
,这是可以理解的。让我们向构造函数的原型添加另一个属性:

Counter.prototype.c = "third";  
现在,
counter.c
将返回“third”。但是我们改变了主意,让我们摆脱这些财产:

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

Counter.prototype.c = "fourth hohoho";
没有任何变化,计数器c仍然返回“第三个”


为什么它没有成功地移除这些属性?我缺少什么?

您可以动态添加/删除原型对象的属性,但不能替换已创建实例的原型对象。在您的示例中,在替换构造函数的prototype属性后创建的实例将获得新的prototype,但在此之前创建的实例将保留对前一个对象的引用

如果要从原型中清除某些属性,请使用
delete
操作符将其从原始对象中删除:

delete Counter.prototype.c;

创建对象时,对其原型对象的引用将添加到原型中

您可以扩充该原型对象,并且由于实例共享引用,这些更改将反映在任何现有实例中

但是,如果覆盖原型对象,则先前创建的实例仍保留对原始原型对象的引用

这与此代码发生的情况相同:

var a = {};
var b = a;

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

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

你确定吗?尝试:

函数fa(){this.a=1} var fb=新fa(); fa.a=2; fa.prototype.a=3; var fc=新fa();
console.log(fa.a、fb.a、fc.a)查看原型在Javascript中的工作方式。构造函数仅建立新对象与构造函数的
.prototype
对象之间的关系。在这一点之后,构造器几乎是无关紧要的。这两个物体之间的关系才是最重要的。嗯,事实证明它是那么的琐碎。不,它不应该。问题是关于为什么创建新的原型对象时没有清理以前创建的对象中的原型。这里写的是“1”而不是“3”,因为要获取属性“a”的值,对象首先检查它在对象中的存在性和值,然后在原型链中检查。在控制台中尝试时,这只返回“true”。我是web开发人员,但在应用此语句之前/之后,我看不到从原型创建的现有或新对象有任何更改