为什么可以';JavaScript中的对象不是自身的原型吗?

为什么可以';JavaScript中的对象不是自身的原型吗?,javascript,object,overriding,prototype,Javascript,Object,Overriding,Prototype,获取下面给定的代码,并将其与后面的代码进行比较: var protoShoe = {isShoe:true, isGenderSpecific: false} protoShoe = Object.create(protoShoe); protoShoe.isGenderSpecific= true; protoShoe.gender = "mens"; protoShoe = Object.create(protoShoe); protoShoe.isGenderSpec

获取下面给定的代码,并将其与后面的代码进行比较:

var protoShoe = {isShoe:true, isGenderSpecific: false}  
protoShoe = Object.create(protoShoe); 

protoShoe.isGenderSpecific= true;  protoShoe.gender = "mens";  

protoShoe = Object.create(protoShoe);  

protoShoe.isGenderSpecific= false;  protoShoe.gender = "na";  

console.log("Is protoShoe prototype of protoShoe:" + protoShoe.isPrototypeOf(protoShoe));
console.log(protoShoe);
VS

最后一个对象在继承属性方面似乎非常相似,但在第一种情况下,我们只是继续重用
protoShoe
对象,最终它不是自己的原型,这是为什么?如果是,会导致什么问题?


我只是想更好地理解原型继承,这只是一个愚蠢的实验,但我发现第一个变量的
isPrototypeOf
值很有趣。

您创建的
protoShoe
变量是对对象的引用。当您
protoShoe=Object.create(protoShoe)时创建新对象并覆盖引用。它不是相同的对象,即使它被称为相同的对象。旧的
protoShoe
仍然存在,但现在唯一引用它的是新的
protoShoe
的原型

本质上,您重用的是变量的名称,而不是对象

不可能创建一个本身就是原型的对象。至少在我检查过的任何JS运行时中。由于属性查找的工作方式,它将创建一个无限循环

当您有一个对象时,比如说,
protoShoe
,并且想要查找该对象上的属性时,比如说,
notAShoeProperty
,JS首先检查对象本身的属性。如果找不到,它将查找原型链。如果在原型上找不到,它会在原型的原型中查找,等等。因此,如果对象是它自己的原型,尝试查找未定义的变量将导致无限循环


我所知道的真正尝试创建这样一个原型链的唯一方法是做
protoShoe.\uuuuu proto\uuuuu=protoShoe
。V8抱怨循环proto值并抛出错误。

这是一个与Javascript相关的问题吗?有道理。当您使用protoShoe=Object.create(protoShoe)时;创建新对象并覆盖引用。它不是相同的对象,即使它被称为相同的对象。旧的原型鞋仍然存在,但现在唯一提及它的是新原型鞋的原型。这一点很清楚。谢谢你的帮助,我事先就明白这是一件愚蠢的事情,但我想,理解这不起作用的原因也会在我的大脑中巩固一些其他的概念。希望其他人发现这个愚蠢的问题,但解释得很好的答案很有帮助!
var protoShoe = {isShoe:true, isGenderSpecific: false}  
mensShoe = Object.create(protoShoe); 

mensShoe.isGenderSpecific= true;  mensShoe.gender = "mens";  

protoShoe = Object.create(mensShoe);  

protoShoe.isGenderSpecific= false;  protoShoe.gender = "na";  

console.log("Is mensShoe prototype of protoShoe:" + mensShoe.isPrototypeOf(protoShoe));
console.log(protoShoe);