網(LieHuo.Net)教程 大一點的框架都有這個東西。Prototype原來的繼承機制非常弱,為了與mootools對抗也強化了這一方面。嘛,要用原型繼承來模仿類繼承,都基本存在一個克隆函數。把父類的原型屬性復制到子類上去。理念的東西暫時這么多,動手實踐一下最實際。我們設計一個數組類,擁有原生數組的能力與新擴展的能力。
提示:可修改后代碼再運行!
很顯然這是工廠方法,生成的原生數組,如果要擴展而不污染原生數組就又要再加一重包裝。我們看繼承是怎樣實現的。這涉及到兩個類,原生數組類與新數組類。先看代碼:
提示:可修改后代碼再運行!
由于javascript的原型鏈的關系,我們不能直接var Array2 = Array;var a = new Array2;這樣一旦從Array2的原型添加新方法(添加方法都建議往原型里加,不建議做成類方法)時,Array的原型也被加上了,因為它們是在同一條船上。我們必須斷開它們。于是我們需要一個Parent函數做橋接。我們可以說Array為目標父類,Parent為真正父類。先把目標父類的原型賦給Parent的原型,這樣Parent就擁有其所有公開的方法,然后我們再把這些方法賦給Array2。但這時Array2的實例的constructor 仍為原生的數組,我們要修正一下。我們可以參見下圖看Prototype與constructor的關系。
我們再把部分代碼抽取出來做成一個方法:
提示:可修改后代碼再運行!
上面的_mixin方法是最常見的繼承方法,早期的Prototype也是依靠來拷貝原型方法,堂而皇之地稱之為extend,而且什么也情況也不考慮。在Ext這里分成幾種情況apply,applyif,override。在mootools中則叫add。
好了,我們來考慮如何訪問父類方法(我們可以通過重載方法來區分哪是子類方法,哪是父類方法)。要想訪問父類方法,就必須能訪問父類,我們把父類的名稱保存在子類原型的一個屬性即可。我們把makeBridge方法擴展一下,更名為inherit。
提示:可修改后代碼再運行!
但是這樣做還是不爽,因為我們還是需要手動設置var Tiger = function(){}這個空函數,這個下回再說。
作者博客:http://www.cnblogs.com/rubylouvre/