一個人學許多東西,不等於他會很多東西,學了也會忘的,學了也不等於會運用,這時我們應該整一個很複雜的東西出來,那麼就知道自己到底去到什麼程度。基於這樣的理由,我開始搞架構了,像我群裡面的許多人那樣,因此請不要感到驚奇或敬佩什麼的。我們總是免不了造輪子,前人走過路,我們也不得不走,只不過懷著不同的目的與心情。我也沒有自大到想去挑戰這個挑戰那個,僅僅是想自食其力,或許其最好的結果是拿來與友人切磋切磋。於是掂量一下,總結如下,如果有好心人能迷津指點最好不過。
首先要模組化。像jQuery那樣內部看起來亂成一團的類庫,如果去github看一下,發現還是很有組織地分成幾塊。這樣對逐個改進非常有利。當然如果與Ext,Base2,mootools比起來,jQuery肯定不合格。
二,風格要統一,像Prototype滿眼是ruby標準庫的方法名,mootools擁有許多$開頭的方法,方法多是單個單詞,jQuery的方法則是多為縮減語。我基本上跟Prototype走,但有些名字非常流行,我也會採納的。總之,讓大家一看就知這方法與屬性是幹什麼。
三,不使用with,不對Object與DOM的原型進行擴充,不濫用try...catch與自動執行函數。
基於上面三條鐵則,我開始設計我的類庫。由於是模組化,因此它會把邊沿的功能放置到其他JS檔案中,核心功能置為一個檔案。對,就像Ext,mootools那樣。這樣帶來兩個問題,其他JS檔案怎麼知道它是本類庫的一部分,肯定要像Ext暴露一個不會變的全域變數,不能像jQuery那樣使用noConflict處處退讓。注意,我做的是架構,不是類庫。它的功能體系應該具有足夠的廣度與深度來滿足我們的需要,不能項目做到一半,發現它不夠用,被逼搭上十幾個外掛程式或另一個架構,這樣的項目維護起來很頭痛。換言之,它擁有一個堅定不移的命名空間,像Ext或YUI那樣。另一個問題是,如何載入那些子模組。像Ext那樣實在太不人道,動不動都要自己加。雖然javascript模組的依賴關係肯定比不上java的,但我們不應該排除這種可能,如我們有一天牛起來,要實現一個WEB OS呢?!因此需要一個像dojo那樣的包機制,功能不一定像它那樣強悍,但一定要有。於是第一個功能就這樣確定,擁有一個模組載入器。
第二個功能是擁有一個強大的類工廠。jQuery在這方面真是不行,沒有類,做大一點的東西,這缺點就暴露出來了,代碼非常難組織,別人也很難讀懂你的代碼。在這方面,mootools的實現是最漂亮的,這非常值得參考。
第三個功能是瀏覽器嗅探,不過盡量利用非UA技術來實現。各瀏覽器的navigator.userAgent都在撒謊,非常不可靠。事實上,不用AU,我與群裡的朋友找得許多更好的替代品。mootools的思路基本與我的一致,需要自豪一下。
第四個功能是類型識別,像jQuery只提供了很少實現,isArray與isFunction,非常不夠用,有時我們還要判定字串數字呢!不過,jQuery1.4中提供了一個isPlainObject,用於深拷貝,這函數要盜竊一下。
第五個功能是特徵偵測,基本上用作內部方法。這個我有專文介紹。
第六個功能是擴充一下一些原生對象。讓原生對象也能漂亮的“鏈”起來。暫訂對象為Array,String,Number,Function。
第七個功能是提供一個選取器,我已經實現了一個,正好為它找個好歸宿。做了一個架構,動不動要借用人家的選取器非常可悲,這裡特意點明批評一下Prototype1.7rc同學,實在太讓我失望了。
第八個功能是處理文檔,指建立節點,插入節點,替換節點,刪除節點與複製節點。建立節點中利用innerHTML可以大大提高效率。刪除節點方面,innerHTML在IE下又立功了,具體見我另一篇博文《IE中的 DOM 超空間與innerHTML》
第九個功能是遍曆文檔,指給定一個節點,找到其左鄰右鄰五姑六婆,具體可參考一下jQuery的API。
第十個功能是設定與擷取元素節點的屬性與樣式。對className的操作也列入此模組。
第十一個功能是非同步呼叫,換言之是Ajax,對於不同源者,還要用上動態script。JSON的相關處理也列入此模組。
第十二個功能是事件處理,主要工作是處理瀏覽器的差異性,二是提供一個觀察者模組,實現自訂事件,三是提供一個(記憶體)緩衝系統。
第十三個功能是對元素進行變形操作,以及基於其上的特效。具體可參考mootools的API。
第十四個功能是提供本地儲存,利用一切可用的資源,如cookie與userData,HTML5還帶來許多好東西。
第十五個功能是提供一個列隊機制,這應該像dojo或Mochikit的Deferred模組,而不是jQuery那個簡單的queue與delay。
第十六個功能是統一對XML的操作。
嘛,基本上是這樣,功能很多,不過由於是對原生對象進行了原型擴充,許多方法會寫得很精簡的。如有什麼好建議不妨提出來我聽聽。