2012-09-03 28 views
1

我在JS使用這個模式來繼承的Javascript多重繼承模式

MyApp.utils = { 
    extend: function (subClass, baseClass, subClassMethods) { 
     function inheritance() { } 
     inheritance.prototype = baseClass.prototype; 
     subClass.prototype = new inheritance(); 
     subClass.prototype.constructor = subClass; 
     subClass.baseConstructor = baseClass; 
     subClass.superClass = baseClass.prototype; 

     if (subClassMethods == null) return; 

     for (var index in subClassMethods) { 
      subClass.prototype[index] = subClassMethods[index]; 
     } 
    } 
}; 

您可以使用它像

MyApp.utils.extend(SubClass, BaseClass, { 
    subMethodOne: function() {   
    } 
}); 

這已經很好地工作和代碼是非常簡單的,但是它沒有多重繼承工作,因爲構造函數調用將是子類的基類來代替,這將創建一個堆棧溢出

什麼是多重的最佳模式傳承?它必須支持的原型和獨立的構造邏輯每班

的jsfiddle:http://jsfiddle.net/HcPhL/1/ 它會崩潰FF所以要小心:d

+0

如果你打開一個現有的繼承模擬方法具有佔地面積小,我都用,效果很好這樣的:http://ejohn.org/blog/simple- JavaScript的繼承/ – David

+0

謝謝,在小提琴重覆方法和調用基礎方法嘗試它,這是可能的嗎? http://jsfiddle.net/xFPy4/ – Anders

+0

它可以(將)重寫原型。 'this._super()'調用同名的超類方法,它不是超本身的引用。 HTTP://的jsfiddle。net/xFPy4/1/ – David

回答

1

繼承在JavaScript是基於原型。這意味着對象相互繼承,而不是類。不要試圖使用其他編程語言的習語,我建議你學習javascript自己的習語。我發現使用模塊,克隆和複製功能(因爲函數是對象),比JavaScript中的經典繼承更有用。

這就是說,你想做的事,可以實現以下方式是什麼:

我們希望一個ç排序對象的繼承

  1. 創建一個新的對象稱它爲A
  2. 迭代B的每個屬性(使用for ... in循環)並將其分配給A.
  3. 迭代基於C的每個屬性(使用for ... in循環),並將其分配給A,在這裏,你可能要考慮的是你對解決衝突(這意味着你要優先考慮其方法,B或C。

有很多開源的javascript庫有一個擴展函數,你可以查看那裏的實現。道格拉斯克羅克福德還對如何完成繼承herehere is an article about javascript multiple inheritance

我假設你要完成什麼碼再用一個基本的文章,我建議你看一下這個免費書籍由阿迪·奧斯馬尼learning javascript design patterns。特別是模塊模式。

0

使用混入圖案或裝飾圖案,以支持多重繼承。我可以給你一個詳細的實施,如果你需要一個