2015-09-06 62 views
1

採取低於給定的代碼,並將其與後它的代碼比較:JavaScript中的對象爲什麼不能成爲其本身的原型?

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

+0

這是一個Javascript相關問題? – connexo

回答

3

您創建的protoShoe變量是對對象的引用。當你protoShoe = Object.create(protoShoe);你創建一個新的對象並覆蓋引用。這不是同一個對象,即使它被稱爲相同。舊的protoShoe仍然存在,但現在唯一的參考是在新的protoShoe的原型。

本質上你正在重複使用的是變量的名稱,而不是對象。

不可能創建一個自身原型的對象。至少在任何JS運行時我都檢查過。由於屬性查找的工作原理,它會創建一個無限循環。

當你有一個對象,比如說protoShoe,並且想查找它的一個屬性,比如notAShoeProperty,JS首先檢查該屬性的對象本身。如果它找不到它,它會查找原型鏈。如果它沒有在原型上找到它,它會查找原型的原型等。如果你有一個對象是它自己的原型,試圖找到一個未定義的變量會導致無限循環。

而我知道的真正嘗試創建這樣一個原型鏈的唯一途徑就是通過做protoShoe.__proto__ = protoShoe。 V8抱怨循環原型值,然後拋出錯誤。

+0

有道理。 _當你protoShoe = Object.create(protoShoe);你創建一個新的對象並覆蓋引用。這不是同一個對象,即使它被稱爲相同。舊的protoShoe仍然存在,但現在唯一的參考是新protoShoe._的原型。感謝你的幫助,我事先了解到這是一件愚蠢的事情,但我想通過理解這種行爲不起作用的原因,也會在我的大腦中強化其他一些概念。希望別人找到這個愚蠢的問題,但很好解釋的答案有幫助! –

相關問題