为什么 JavaScript 中的对象不能是其自身的原型?

Why can't an object in JavaScript be a prototype of itself?

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

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

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);

最终对象的继承属性看起来非常相似,但在第一种情况下,我们只是继续重复使用 protoShoe 对象,最后它不是它自己的原型,这是为什么?如果是的话会有什么问题吗?

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

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

基本上你重用的是变量的名称,而不是对象。

无法创建作为自身原型的对象。至少在我检查过的任何 JS 运行时。由于 属性 查找的工作方式,它会创建一个无限循环。

当你有一个对象,比如说,protoShoe,并且想要在它上面查找一个 属性,比如说,notAShoeProperty,JS 首先检查对象本身是否有那个 属性。如果没有找到,它会查找原型链。如果它没有在原型上找到它,它会在原型的原型等中查找。所以如果你有一个对象是它自己的原型,试图找到一个未定义的变量会导致无限循环。

我知道真正尝试创建这样一个原型链的唯一方法是 protoShoe.__proto__ = protoShoe。 V8 抱怨循环原型值然后抛出错误。