2012-01-18 145 views
0

這是我的第一篇文章!我有一個關於JavaScript中的繼承問題。使用擴展功能

當然'extend2'方法用於使用for-in循環從父對象繼承子對象。

var extend2 = function (child, parent) { 
    var c = child.prototype; 
    var p = parent.prototype; 
    for (var i in p) { 
     c[i] = p[i]; 
    } 
} 

我現在在閱讀由Stoyan Stefanov撰寫的「Object Oriented Javascript」。這是一本很棒的書。

任何人都可以給我一個很好的詳細解釋,如何孩子的原型對象沒有完全覆蓋或取代,但它只是增強?

當對象繼承時,它們如何複製(原始數據類型),而不是通過使用extend2函數查找爲引用?

這真的會幫助謝謝!

+0

你'extend2'不工作作爲斯托揚人。他遍歷父母**原型**並將所有屬性複製(原文)到孩子**原型**。當你迭代父母原型時,你嘗試訪問和複製對象本身的屬性,而不是它們的原型。 – bennedich 2012-01-18 02:25:25

+0

我的錯誤bennedich,我重新編輯我的代碼。 – user1120327 2012-01-18 02:42:53

回答

0

javascript中的原始數據類型是通過值而不是引用傳遞的。因此,當你複製一個值時,它實際上正在複製它,而不是指它。 傳統上,這是因爲一個原語以這種方式在存儲器中字面編碼(所以原始int 7將在內存中編碼爲0x7)。但是,當處理對象時,它們被編碼爲指向內存位置的指針,因此,當您複製該值時,它僅僅是參考指針的副本,而不是指針引用的對象。

至於兒童的原型未被替換的事實,那是因爲樣機在java中僅僅是另一個對象,這樣一個原型可能看起來像:

{ 
    someField: 5 
} 

這將表明該對象的實例將與場初始化稱爲someField其值爲5。通過上面的代碼,對象中的每個條目都被複制到子原型,但沒有任何內容被刪除。因此,如果孩子原型的樣子:

{ 
    someField: 10 
    someOtherField: 3 
} 

然後執行上面的命令extend2將覆蓋someField,但不someOtherField,因此所得到的原型是:

{ 
    someField: 5 
    someOtherField: 3 
}