【问题标题】:Why can't an object in JavaScript be a prototype of itself?为什么 JavaScript 中的对象不能是它自己的原型?
【发布时间】:2015-09-06 06:59:07
【问题描述】:

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

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 值很有趣。

【问题讨论】:

  • 这是一个 Javascript 相关的问题吗?

标签: javascript object overriding prototype


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 有道理。 当你 protoShoe = Object.create(protoShoe);您创建一个新对象并覆盖引用。它不是同一个对象,即使它被称为相同的对象。旧的 protoShoe 仍然存在,但现在唯一引用它的是新 protoShoe 的原型。 说明了这一点。谢谢你的帮助,我事先明白这是一件愚蠢的事情,但我认为理解这不起作用的原因也会巩固我大脑中的一些其他概念。希望其他人发现这个愚蠢的问题,但解释清楚的答案很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多