透視Ext JS 4類背後的機制與特點(上)

Ext JS 4 的類機制大概如何,主要圍繞傳統OO模型而設計,彌補了Prototype OO不足。雖然性質上仍爲模擬的手段,但包含了比較完整的OO特徵。Ext JS 4(連同 Ext Core)提供的新功能有:

  • 繼承方面Ext.defined代替了原來Ext.extend的寫法。
  • 自動計算依賴關係及動態類加載。
  • 多態
  • 靜態成員
  • 爲配置項自動生成的getter/setter方法

如果還是感覺理解得不夠透徹,一點的建議就是花多點時間瀏覽一下資料,還有在線的例子 。今天我們將會更深入到類機制其背後的原理去看看。

繼承

大體從外觀來說,新的類機制會是這樣子的:

  1. Ext.define('Ext.Window', {  
  2.     extend: 'Ext.Panel',  
  3.     requires: 'Ext.Tool',  
  4.     mixins: {  
  5.         draggable: 'Ext.util.Draggable'  
  6.     },  
  7.     config: {  
  8.         title: "Window Title"  
  9.     }  
  10. });  

以上演示的是Ext.Window類的簡化版本,Windows的寫法就是這樣子了。首先要設置Windows爲Panel的子類(extend),並依賴於Ext.Tool類(requires),然後混入(mixns)Ext.util.Draggable。嗯,過程大致這樣。下面我們要展開分析,並穿插幾個新的概念。其一、“extend”的聲明就如你所料的,告訴ExtWindows應該是Panel對象的子類。extend不是新的概念,跟過去我們比較熟悉的Ext.extend()無二,這裏就不展開復述了。其二、“requires”告訴Ext在Window類出現之前應該要準備那些類。該類依賴的類就是Ext.Tool。如不出現則Windows無法工作。其三、“mixins”就是Ext OO多態的應用了,下一節會講。最後部分,也會講到config配置項及其用法。

舊版Ext中,調用父類必須完全寫出父類的地址,如Ext.Panel.superclass.initComponent.call(this);不僅冗長,且難記憶,加上連串訪問hash的操作起來也消耗性能不少。於是新版中作了簡化,支持通過this.parent()即可返回父類對象。當然舊的方式在代碼可讀性、直觀性上卻頗爲可取,而且還可以做到跨越一層父類的直接訪問(儘管用得比較少)。

另外關於擴展功能的兩點:

  • require項的功能與Ext.require()功能一致。當前Ext.require只能獲取JS文件,若拓展至其它類型的文件(如css/tpl資源),可能要觀察新版本的改進。
  • Ext.define/Ext.require支持送入一個回調函數。那麼回調函數會傳入什麼的參數呢?當前Ext.require()的回調函數沒有參數傳入,不過Ext.define()就有一個,參數是剛創建的類,且回調函數的作用域也是創建好的類。

多態 mixins

多態是Ext JS 4前所未有過的概念。簡單講,所謂多態就是幾個函數或屬性合併到一個類之中去。例如在上面的例子,Ext.util.Draggable作爲多態的類混入到Ext.Window,那麼,Ext.Window就擁有了本來在Draggable的“startDragging”方法。結果是,任何一個窗體實例都有startDragging()可執行。

  1. var  win = Ext.create( 'Ext.Window' );  
  2. win.startDragging(); // "開始拖動"   

相比較傳統的單根繼承,多態靈活很多。多態實質是多繼承的概念。Ext.Windows是一個可拖動的組件,如同Sliders、Grid頭部等等都是可拖動的組件。在不同的組件中都可能使用到“拖動”的功能,如果把它做成一個單獨被繼承的類就顯得不太方便和合理,因爲不同的組件極可能不是繼承於同一個父類。硬是弄在一起也很麻煩。所以創建一個Draggable的接口來解決此類問題是很有必要的,而且使用多態也是相當優雅的寫法。

多態的類是否有構造器以供創建實例時候調用?當前沒有,但是你可以透過“主類”的構造器調用mixin即多態類的構造器,這樣也行。官方打算在後面的版本中提供一個autoInstantiateMixin的參數是否調用多態類的構造器。

轉自:http://blog.csdn.net/zhangxin09/article/details/617408

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章