js學習之路--mxGraph(1)
接觸JS也已經有1年多時間了, 總感覺從編寫到調式,到最後的維護都是沒有像java一樣有很多工具支撐,使得做這些事情的時候麻煩叢叢。不過我喜歡這種感覺。~_~!!
最近要做一個網上圖形展現,所以接觸了mxgrath,從它的原始碼看無論從結構還是編碼風格都有很多可以學習的地方,讓我來勁。不過最麻煩的地方就是網上沒有中文資料,連英文資料也只有它的官方網站上才有。已經連續肯了2天的官方的英文資料和相關doc了,我會將一些學習心得放在上面,希望有同仁一起進步,歡迎加我好友,可以一起討論。
20080409心得:
之前js是一種過程型語言,但mxGraph告訴我js其實有類的感念。它也有classes
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+"
}
}
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會自動地找prototype的prototype屬性對應的物件來查詢,這樣就通過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方法執行了兩步操作。第一:將BaseClass以apply傳遞的Array陣列作為初始化引數進行例項化。
第二:將新生成的例項物件的所有屬性(name,age,ToString方法)複製到 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();