1. 程式人生 > >js學習之路--mxGraph(1)

js學習之路--mxGraph(1)

   接觸JS也已經有1年多時間了, 總感覺從編寫到調式,到最後的維護都是沒有像java一樣有很多工具支撐,使得做這些事情的時候麻煩叢叢。不過我喜歡這種感覺。~_~!!

   最近要做一個網上圖形展現,所以接觸了mxgrath,從它的原始碼看無論從結構還是編碼風格都有很多可以學習的地方,讓我來勁。不過最麻煩的地方就是網上沒有中文資料,連英文資料也只有它的官方網站上才有。已經連續肯了2天的官方的英文資料和相關doc了,我會將一些學習心得放在上面,希望有同仁一起進步,歡迎加我好友,可以一起討論。

20080409心得:

  之前js是一種過程型語言,但mxGraph告訴我js其實有類的感念。它也有classes

and singletons (普通類和單),還有繼承。程式碼例子如下:

singletons:

var singletonClass={          prama1:value1,

                                                   prama2:value2,

                                               functionnam:
function(prama){
                                                       
//function body
                                                  }

                                                 …………
                                                 …………

}

class和繼承

 方法1:

var BaseClass =function()
 
{

    
this.name ="3zfp";
 
     
this.age =100;
 
     
this.ToString =function(){

        
returnthis.name+"
"+this.age;

    }


}


var Derived =function()



    
this.address ="ShenZhen";

}


Derived.prototype 
=new BaseClass();

var instance =new Derived();

instance.ToString();

這種方式最為簡單,只需要讓一個類的prototype為被繼承的一個例項就ok,然後直接使用BaseClass的方法。

prototype屬性是啥意思呢?prototype即為原型,每一個物件(function 定義出來)都有一個預設的原型屬性,該屬性是個物件型別。並且該預設屬性用來實現鏈的向上攀查。意思就是說,如果某個物件的屬性不存在,那個將通過prototype屬性對應的物件的來查詢該物件的屬性。如果prototype查詢不到呢? js會自動地找prototypeprototype屬性對應的物件來查詢,這樣就通過prototype一直往上索引攀查,直到查詢到了該屬性或者prototype最後為空("undefined");

例如:上例中的instance.ToString()方法。js會先在instance例項中查詢是否有ToString()方法,因為沒有,所以查詢Derived.prototype屬性,prototype NewClass的一個例項,該例項有ToString()方法,於是呼叫成功;同樣給instance name 屬性賦值時也是查詢prototype來實現的。

這種方法有一個缺點就是無法傳遞引數給superclass,也就是說這種繼承方法只適合superclass的constructor沒有引數的類。

方法2:

aplly

var BaseClass =function()
 
 
{
 
     
this.name ="3zfp";
 
     
this.age =100;
 
     
this.ToString =function(){

        
returnthis.name+""+this.age;

    }


}


var Derived =function()

{

       BaseClass.apply(
this,new Array());

    
this.address ="ShenZhen";

}


var instance =new Derived();

instance.ToString();

 

該方法普遍的解釋為用A方法去替換B方法。第一個引數為B方法的物件本身,第二個引數為一個數組,該陣列內的值集合為需要傳遞給A方法對應的引數列表,如果引數為空,即沒有引數傳遞,則通過 new Array() 來傳遞,null無效。

一般的方式為:

但是在本例當中,apply方法執行了兩步操作。

 第一:將BaseClassapply傳遞的Array陣列作為初始化引數進行例項化。

 第二:將新生成的例項物件的所有屬性(nameageToString方法)複製到 instance例項物件。這樣就實現了繼承。

但是用apply方法也還是有缺點的,為什麼?在js中,我們有個非常重要的運算子就是"instanceof",該運算子用來比較某個對向是否為某種型別。對於繼承,我們除了是屬於 Derived型別,也應該是BaseClass型別,但是。apply方式返回值為false((instance instanceof BaseClass) == false).由於prototype.js使用了類似apply的方式,所以也會出現這個問題。

方法3:

call+prototype

這個方法就解決了方法1無法傳遞引數的問題也解決了instanceof 方法問題

var BaseClass =function(name,age)
 
 
{
 
     
this.name = name;
 
     
this.age = age;
 
    
this.ToString =function(){

        
returnthis.name+""+this.age;

    }


}


var Derived =function()



       BaseClass.call(
this,"3zfp",100);

    
this.address ="ShenZhen";

}


Derived.prototype 
=new BaseClass();

var instance =new Derived();

instance.ToString();