ExtJS 設計模式 之一 (單例)
Extjs 發(fā)展至今,傳承了YUI的偉大精髓, YUI得到了Douglas Crockford(任職于 Yahoo! 的一名 JavaScript 傳道者和架構師,他是全球最有造詣的 JavaScript 語言專家之一,Blog:
http://www.crockford.com/) 大師的贊同,而ExtJS也是將YUI的模式腳本編程學習使用的淋漓盡致,并且還給它做了幾套華麗的CSS嫁衣…., 而在ExtJS越發(fā)耀眼的同時,我等初學者在使用ExtJs的時候也是暈呼其呼。(好在2.0 推出之后,官方的文檔,像雨后春筍一樣,開始覆蓋到方方面面。)
其實,撥開ExtJS華麗的外衣,翻閱其體內(nèi)精致的代碼,不難發(fā)現(xiàn)一些我們耳熟能詳?shù)脑O計模式。
在早期1.0,1.1的好多例子中,我們會看到這樣風格的代碼。
var Oo= function(){
var x;
var y;
return{
a:function(){
...
},
b:function(){
...
}
}
}();
咂一看,不是我們能理解的方式, function(){}(), 是何意?。
//()在這里,意味著方法已經(jīng)執(zhí)行,并且return里面的已經(jīng)產(chǎn)生, 這樣可能很難理解,那等同與執(zhí)行 function oo(){},這樣是否好理解些了?
BTW :這里要引入JavaScript的一個高級概念,“閉包”。(具體內(nèi)容參考《JavaScript The Definitve Guid,5th Eddion》Section 8.8 –Function Scope and Closures ,也是被Douglas Crockford推薦的為數(shù)不多的兩本書籍之一。), 當然不急著去翻,先把我的廢話看完。
好了,看這種使用別扭的使用方式, 而這種方式,在我們的頁面,或者其他類中, 調(diào)用Oo的a方法的時候,形式如下
Ext.onReady(Oo.a); 對,正是這樣的一種JS編程方式,被Douglas Crockford作為JS的一種單例的實現(xiàn), 大師還把它叫做“Module Pattern”,
好,如果我們不用所謂單例呢?, 就看看傳統(tǒng)的對象方式,同學們肯定在Pototype盛行的時代,已經(jīng)弄的一清二楚。
0o = function(){
this.x;
this.y;
}
Oo.prototype = {
a:function(){
this.x = 100;
},
b:function(){
this.y = 200;
}
}
//調(diào)用方式
Ext.onReady(function(){
var o = new Oo();
0.a();
});
再來,假使是個初學者,不知道對象繼承,怎么辦。更土的寫法,人人都會。
var x,y
function a(){
x=100;
}
function b(){
y=200;
}
調(diào)用方式。
不用說了,只要a(),就會把x設置, 全世界的開發(fā)者都公認 ,全局變量是邪惡的,,而且隨著你調(diào)用的不注意,將會越來越臃腫,導致Memory Lacks 內(nèi)存泄露。
以上幾個簡單的舉例可以看出, 類 比Java 一樣, Oo.a直接調(diào)用,好比一個靜態(tài)類,直接訪問。 而prototype需要創(chuàng)建對象后訪問其成員。
第一種方式,在任何地方都不需要創(chuàng)建(只創(chuàng)建一次),
而第二種方式,需要在每次調(diào)用的時候,創(chuàng)建對象。
第三種老土的代碼,希望大家盡量少寫,這不是程序員風格的體現(xiàn)。
對于發(fā)展到今天,如此龐大的ExtJS2.0,自然也要考慮道自己的運行和調(diào)用不要讓new 變得太臃腫,在ExtJS中我們發(fā)現(xiàn), 在會被各個組件大量頻繁調(diào)用到的一些工具類中,單例運用較為頻繁。
Ext 源碼中,設計使用單利的代碼片段。
//source/core/DomHelper.js
Ext.DomHelper= function() {
//private attributes
..
return{
}
}();
//source/core/DomQuery.js
Ext.DomQuery =fucntion(){
}();
后記:由于JavaScript,具有prototype,call,apply來實現(xiàn)繼承,面向?qū)ο髞黹_發(fā),又有閉包等特性來進行函數(shù)編程。有函數(shù)編程和面向?qū)ο蟮碾p重性質(zhì), 使得JavaScript格外的靈活,難以駑駕, 開發(fā)者選擇多種風格來進行編碼,在一個整體項目會容易會走向凌亂和滅亡。這就更需要我們從大師的經(jīng)驗總結(jié),以及ExtJS這種優(yōu)秀的設計中,去體味學習,站在巨人的肩膀上前進…..
(另外值得一提出的,ExtJs必須要求你的頁面為XHTML,當你在別的瀏覽器下跑的非常順暢,而唯獨IE下有那么點瑕疵(不是腳本報錯的),你應當檢查下你是否把你的頁面定義成XHTML.)。