2017-03-09 97 views
0

我的項目中涉及到JS的原型繼承問題。和抽象的主要問題如下:javascript:有關原型繼承的一個令人困惑的問題

var parentObj = { 
    value:"parent value", 
    obj: { 
     obj: "parent obj value" 
    } 
} 

var childObj = Object.create(parentObj) 

的文本對象的方式來創建parentObj,並創建一個基於它childObj並使其爲原型。

而在第一種情況如下:

childObj.value ="child value" 
childObj.obj = {obj:"child obj value"}; 
console.log(parentObj) 
console.log(childObj) 

輸出爲:

{ value: 'parent value', obj: { obj: 'parent obj value' } } 
{ value: 'child value', obj: { obj: 'child obj value' } } 

這個結果去預期。

但對於第二種情況如下:

childObj.value ="child value" 
childObj.obj.obj = "child obj value"; 
console.log(parentObj); 
console.log(childObj); 

的輸出是:

{ value: 'parent value', obj: { obj: 'child obj value' } } 
{ value: 'child value' } 

parentObj被改變。這個結果對我來說有點困惑,有什麼幫助?

+0

我認爲這是唯一的孩子對象返回「孩子OBJ值」。 你能再請檢查一次嗎?或者檢查childObj .__ proto__,它會顯示parentObj。 – Nitesh

+0

@Nitesh,我確認了我發佈的結果。 –

+0

讀取'childObj.obj'屬性使用原型繼承並獲得'parent.obj'。此時,'childObj.obj'和'parentObj.obj'是對同一個對象的引用,所以對這個對象的修改都可以通過這兩種方法看到。 –

回答

0

當您使用x = Object.create(y)時,您會收到一個對象x,其中y爲其__proto__屬性。

__proto__允許在JS性能代表團。

屬性委託意味着當您向對象提出屬性時,如果該對象沒有該對象,對象將詢問其父對象(__proto__)。如果父對象也沒有它,那麼它會詢問它的父對象。

如果鏈耗盡之前找到該值,則返回,否則undefined返回。


在你的情況

var parentObj = { 
    value:"parent value", 
    obj: { 
     obj: "parent obj value" 
    } 
} 

var childObj = Object.create(parentObj) 

parentObjchildObj

console.log(childObj.__proto__ === parentObj) // true 

另外,__proto__childObj有自己的屬性命名爲.obj.value。 您可以使用Object.getOwnPropertyNames進行檢查。 這是確切知道對象上是否存在屬性的唯一方法。

console.log(Object.getOwnPropertyNames(parentObj)) // ["value", "obj"] 
console.log(Object.getOwnPropertyNames(childObj)) // [] 

當你做childObj.obj.obj = ...,你修改的對象parentObj.obj的財產.obj

相反,當你做childObj.obj = ...,你childObj添加新屬性.obj

childObj.obj = "child obj value" 
console.log(Object.getOwnPropertyNames(childObj)) // ["obj"] 

PS:如果您想了解更多關於興田的話題,我建議http://www.javascripttutorial.net/javascript-prototype/