簡體   English   中英

為什么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抱怨循環原型值然后拋出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM