为什么 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 抱怨循环原型值然后抛出错误。
获取下面给定的代码并将其与后面的代码进行比较:
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 抱怨循环原型值然后抛出错误。