2012-08-15 105 views
1

無論我使用「this.value = 1」,我都得到了完全相同的結果。在構造函數內部或者只是將屬性值放入函數構造函數的原型中 - 「MyClass.prototype.value = 1;」javascript原型的點究竟是什麼

function MyClass() { 
//this.value=1; 
} 
MyClass.prototype.value =1; 


var a = new MyClass(); 
document.write(a.value + "<br>"); 
a.value=13; 
document.write(a.value + "<br>"); 

var b = new MyClass(); 
document.write(b.value); 

結果是:

自去年值爲1,顯然每個對象(A,B)得到它的價值自己的副本內它是自己的內存塊 那麼如果原型值不在對象之間共享,那麼使用原型值究竟是什麼?

+1

難道只是我,還是這個問題問的方式太多了? D: – 2012-08-15 02:15:22

回答

6

你的測試是似是而非的。原型值之間共享的值,但在寫入a.value = 13時,您已經shadowedMyClass.prototype.value屬性a。試試這個關於大小:

function MyClass() {} 
MyClass.prototype.value = 1; 

var a = new MyClass(); 
document.write(a.value + "<br>"); 
a.__proto__.value=13; 
document.write(a.value + "<br>"); 

var b = new MyClass(); 
document.write(b.value); 

demo

對象屬性查找旅行了原型鏈,直到原型爲空,或者指定名稱的屬性沒有被找到。在原始測試a.value = 13導致在a.value上的查找以a結束 - 因爲在該對象上有一個名爲value的屬性 - 在到達原型之前。

更多閱讀:

+0

a.prototype.value = 13;不起作用 - 「a.prototype未定義」 – BlackRaider 2012-08-15 02:46:57

+0

哎呀,修正了。抱歉 – 2012-08-15 02:51:18

2

「我得到完全同樣的結果」

只是因爲你不還知道如何解釋你的測試結果。

所有實例從原型共享屬性,但實例可以具有與原型相同名稱的實例屬性。

所以,當你說a.value = 13要創建在a實例的屬性,但原型value屬性仍然1

如果你不是說MyClass.prototype.value = 13你會看到,無論a.valueb.value報告13即使改變原型的value創建ab