2012-09-17 151 views
1

嗨我對jQuery和JavaScript比較新,並且有關於$.extend的功能的問題。我使用extend來覆蓋擴展「基類」的類的原型。 可以撥打基地Parent和兒童/延伸課程AB。 現在當我使用$.extend(true, A.prototype, {someObject: {extraKey: 'value'}});它似乎也Parent的原型被改變關於someObject的內容,導致如果幾個對象/類繼承父母真的很奇怪的行爲。而且這隻有在使用「深度」擴展時纔會發生。jQuery擴展原型

我設法避免這個問題,擴展一個空的對象與各自的原型,然後使用擴展的返回值作爲新的原型。例如。 A.prototype = $.extend(true, {}, A.prototype, {someObject: {extraKey: 'value'}});

爲了證明我創造了這個小的jsfiddle問題:http://jsfiddle.net/x8UtF/12/

實際的問題:是否有辦法讓周圍的空的對象和東西才行extend(true, X.prototype, {});

+0

我對javascript很新,所以我不能真正解釋它如何用這個原型設計來調用它。 – clentfort

+0

也許看看代碼,在小提琴中。它可能比我混淆的詞更清晰。這是我特意爲此寫的,所以不是來自另一個項目的怪異代碼。 – clentfort

+0

'A.prototype = new Parent();' - 我們不再這樣做了。使用'A.prototype = Object.create(Parent.prototype);' –

回答

8

所以,當你做到這一點:

$.extend(true, A.prototype, { 
    someObject: {Aone: 1, Atwo: 2} 
}); 

會出現這種情況的結果:

  1. 屬性"Aone""Atwo"將被分配給Parent.prototype.someObject,而不是A.prototype.someObject(它在此時不存在事件)。
  2. 屬性A.prototype.someObject將被創建,其值將被設置爲Parent.prototype.someObject

所以,無論A.prototype.someObject,並且Parent.prototype.someObject將指向同一個目標:

A.prototype.someObject === Parent.prototype.someObject // true 

這,當然,你想要什麼。


這就是說,我擔心你的模式不好。 A.prototype應該是繼承Parent.prototype,但你複製值從Parent.prototype.someObjectA.prototype.someObject

此外,當前的解決方案:

A.prototype = $.extend(true, {}, A.prototype, { 
    someObject: {Aone: 1, Atwo: 2} 
}); 

不直觀。破譯代碼的功能並不容易。我建議重新評估這種模式。 (當然,你可以問Stack Overflow尋求幫助。)