2015-08-23 70 views
2

說我們有一個代碼示例這樣的設置屬性的困惑:因爲在子對象obj2屬性關於父對象從子對象的JavaScript

var obj1={ prop:1 }; 
var obj2=Object.create(obj1); 
obj2.prop=2; 
console.log(obj1.prop); 

在這裏,我們將不得不爲1輸出prop將被遮蔽。然而,當我這樣做:

var obj1={ prop:{subProp:1} }; 
var obj2=Object.create(obj1); 
obj2.prop.subProp=2; 
console.log(obj1.prop.subProp); 

這裏出奇我發現輸出是2儘管被子對象的變化值。爲什麼不在這裏發生可變陰影。換句話說,爲什麼在obj2上創建了一個名爲prop的新屬性,爲什麼在這裏操作父對象(obj1)的prop

編輯:如果我做了以下

var obj1={ prop:1 }; 
var obj2=Object.create(obj1); 
var isPresent=obj2.hasOwnProperty('prop'); 
console.log(isPresent); 

這裏輸出將是錯誤的。但是:

var obj1={ prop:1 }; 
var obj2=Object.create(obj1); 
var isPresent=obj2.hasOwnProperty('prop'); 
console.log(isPresent); 
obj2.prop=2; 
isPresent=obj2.hasOwnProperty('prop'); 
console.log(isPresent); 

在這裏,你可以行後看到obj2.prop=2輸出是真實的。這也令我困惑。

+1

您可能會發現[*的分辨率對象上的屬性名稱*](http://www.jibbering.com/faq/notes/closures/#clResO)很有用。 – RobG

回答

2

這是因爲當您創建obj2時,沒有任何屬性被複制,但obj2的原型變爲obj1。這意味着在讀取時,引擎會在整個原型鏈中查找屬性,並在寫入時只寫入對象。

當你做什麼obj2.prop = 2發生的是你寫obj2直接,但是當你做obj2.prop.subProp = 2你第一次要求引擎讀取obj2.prop,然後寫信給該對象的一些價值。

在第二個例子中,你從來沒有直接寫obj2所以obj2仍然是「空」(你可以檢查,通過使用obj2.hasOwnProperty('prop')每個例子之後,你的意見建議)

+0

但是,在設置obj2.prop = 2之前添加此行obj2.hasOwnProperty('prop')時,在第一種情況下,我得到錯誤的答案。但是那個暗示支柱在那個點上不存在的woudnt? –

+0

Oups,我誤解了這個問題。你是完全正確的,我完全編輯了答案來糾正這個錯誤。 –

+1

@KiranYallabandi您可能會發現[this](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance)JavaScript快速介紹原型繼承有用。 – Vidul