2016-07-12 72 views
0
function Person(name,age){ 
    this.name = name 
    this.age = age; 
} 
Person.prototype.home = [1,2,3]; 
Person.prototype.aa =100; 
var p = new Person('joy','7'); 


console.log(p.__proto__.home); //[1,2,3] 
console.log(p.__proto__.aa); // 100 

p.aa = 200; 
p.home[0] = 200; 

console.log(p.__proto__.home); //[200,2,3] 
console.log(p.__proto__.aa); // 100 

爲什麼p.__proto__.home發生了變化。在我看來,p.aa = 200;已經改變了p.__proto__.aa,但事實並非如此。爲什麼下面的代碼,'p .__ proto __。aa`不等於200?

爲什麼知道原因?請寫更多的細節。
哪本書與內容有關?

+4

'p.aa!== p.prototype.aa' < - 這些是兩回事嗎? – adeneo

+0

p.home === p.prototype.home? – jiexishede

+1

不是一個答案,但不是雙下劃線proto雙下劃線highl y勸阻(形式明智)?我在一本書中讀到了。 –

回答

2

當您試圖訪問對象上不存在的屬性時,JavaScript將遍歷原型鏈以查找該屬性。但是:

p.aa = 200 

這將直接爲對象分配屬性aa。該對象現在作爲屬性.aa,並且它仍然具有.__proto__.aa作爲兩個獨立屬性。您不是通過分配.aa來間接修改原型。

+0

基本上var p = {aa:200},正確與那條線?我們並沒有改變原型。 (我不是操作,但只是想知道) –

+0

那麼,你是*直接替換*對象,這意味着它也正在失去它的__proto__' ...忽略這個細節,是的,這就是你正在做的。 – deceze

+0

你是什麼意思,失去__proto_? –

0

p.__proto__.home尚未更改。它引用的數組已被更改。

相關問題