[英]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抱怨循環原型值然后拋出錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.