samtiger


          QQ:418148757
          Name:yangchuan
          數據加載中……
          Ext下類函數定義

          一:Ext下類函數定義
          extcore通過:Ext.extend方法來創建類(構造函數),這個類以下用sb代替。
          這個類函數默認會有這些屬性(類屬性)。
          superclass:父類,也就是第一個或第二個參數的prototype屬性對象。(具體根據傳入的參數類型決定)
          superclass(): 父類,(sb.propertype下) 這是一個函數,該函數返回父類的propertype對象
          supr():同上
          constructor():構造函數,(sb函數的propertype對象下)實際上引用的就是sb函數自己。
          override(o):重寫方法,(sb函數下),調用的是 Ext.override(sb, o);也就是將o中的屬性復制到sb的propertype下。
          override(o):重寫方法,(sb.propertype下)也就是將o的屬性復制到sb的propertype下。
          extend(o):(sb函數下),該函數調用的是Ext.extend(sb.o);

          Ext.extend(sb, sp, overrides)方法有三個參數,這三個參數有一定的類型要求:
          sb 一般情況下是一個類函數。
          sp:有兩種情況:一種是類函數,另一種是:一個Object對象。
          overrides:Object對象,通過Ext.override(sb, overrides);方法覆蓋類對象的屬性。

          通過代碼分析,可以看出Ext.extend方法有兩個應用:
          第一:
          因為js沒有重構語法,所以我們沒辦法定義js方法的重構,而上邊這個extend方法,可以說是一種重構的實現。因為,我們通過代碼的分析,我們可以總結出extend方法的參數傳

          遞方式。(用面向對象語言來表示的話,如下結構)
          1:extend(Calss sb,Object sp);
          2:extend(Calss sb,Class sp);
          3:extend(Calss sb,Class sp,Object overrides);
          第一種方式目的是定義一個類函數,這個類函數的父類為sb類函數,屬性方法的定義在sp對象中完成。
          比如: var Student = Ext.extend(Person,{
              constructor:function(old){
            this.age=old;
           },
             name:'sam'}
          })
          其實通過
            if(Ext.isObject(sp)){
                              overrides = sp;
                              sp = sb;
                              sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
                          }

          我們可以看出Ext.extend

          只有在sp.constructor==Object.prototype.constructor的時候,才創建并返回一個函數,該函數就一句話,

          就是調用sb(即父類構造函數)

          如果sp.constructor==Object.prototype.constructor

          那么sp應該是這樣,是一個對象直接量,或者new Object方式創建的對象,且它們都沒有顯示定義

          constructor方法。

          以下這幾種情況都不會有sp.constructor==Object.prototype.constructor。

          1:var obj = new Object(); 

          obj.constructor=function(){...};

          Ext.extend(sb,obj) //extend 返回的類就是constructor函數

          2: var obj = {

          constructor:function(){...}

          };

          Ext.extend(sb,obj) //extend 返回的類就是constructor函數

          3: var obj = new function(){...}();  

          Ext.extend(sb,obj) //extend返回的類就是這個匿名函數

          4: var obj = new function(){

          this.constructor=function(){...} 

          }();

          Ext.extend(sb,obj) //extend 返回的類就是constructor函數。


          總結 :其實很簡單,Ext.extend這么做的目的是要說,定義一個類,構造函數就是constructor方法,如果沒顯示定義這個方法,那么類就使用父類函數作為新類的構造函數。


          var A=function(){
             alert("this is a");
          }
          var B=function(){
             alert("this is b");
          }

          var SubA = Ext.extend(A,new B());
          var subA = new SubA();//這里就會彈出 this is  a 的提示。
          第二種方式:修改現有類的類結構
          2:extend(Calss sb,Class sp);
          這個方法的目的其實之一種包裝,是將sb繼承于sp下,不管sb是不是ext框架下的類,在這個方法執行后sb就成了ext框架
          下的類結構了
          3:extend(Calss sb,Class sp,Object overrides);
          除了有第二種方法的功能外,還額外的給sb添加或覆蓋新的方法或屬性
          Ext.extend(Person,DongWu);
          Ext.extend(Person,DongWu,{sex:'man'});

          posted on 2010-06-29 07:07 sam.chuan.yang 閱讀(1117) 評論(0)  編輯  收藏 所屬分類: javascript 筆記


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 舞钢市| 河间市| 洪洞县| 麻栗坡县| 前郭尔| 台州市| 永春县| 黄山市| 巴楚县| 红河县| 通许县| 稷山县| 遵义市| 高邮市| 汉阴县| 濮阳县| 镇康县| 永吉县| 沂南县| 吴忠市| 东丰县| 平舆县| 泸水县| 景泰县| 义乌市| 内黄县| 茶陵县| 盐源县| 达州市| 丹凤县| 石屏县| 余庆县| 西林县| 宾阳县| 汉源县| 长汀县| 长岛县| 土默特左旗| 菏泽市| 右玉县| 陵水|