自從ajax技術興起之后,開源界就出現了很多著名的JS框架。包括Google的Gmap等一系列,雅虎的YUI,還有就Jquery, Prototype等。使用這些框架就可以用簡單的代碼來實現豐富多彩的功能,有很多甚至是采用了類似面向對象的編程風格。
其實只要了解了Javascript的相關基礎知識,我們完全可以自己寫一個JS框架出來。本文介紹了搭建JS框架的基本原則。(ITcast上的教程-構建自己的JS庫的學習筆記)
Jquery,Prototype等框架流行的原因
總結原因有三:
1. 跨瀏覽器
屏蔽了瀏覽器的不同(類型,版本),畢竟,為市面上的每一款瀏覽器編寫針對性的代碼是極其不合算的
2. 經過了嚴密的測試
代碼的品質可以保證(這也是大多數流行的開源框架的優點)
3. 設計合理
調用這些框架的代碼也會非常的清晰,易懂
因此我們自己要寫JS框架的話,也應該以上面的內容為目標。
構建注意事項
1. 不要使用瀏覽器檢測,要使用能力檢測
“版本檢測”,“瀏覽器嗅探“是javascript最佳實踐中的錯誤用法。
我們不可能為了市面上每一款前途未卜的瀏覽器進行驗證。
即在代碼執行之前,檢測某個腳本對象或方法是否存在(使用if(xxx.xxxx)的方式)。
2. 使用命名空間
真正的命名空間在JavaScript2才支持,現在所謂的命名空間只是在腳本內部構造了一個小空間。
JavaScript支持同名函數,但只使用最后一個函數(不支持重載,不會考慮參數,只看方法名字),
哪一個最后被加載,哪一個就會被調用到。所以不使用命名空間的話,就很容易遇到同名函數沖突的問題。
現行Javascript的命名空間的原理
我們調用的Javascript其實默認都是注冊在window對象上的,我們利用javascript中的對象,構建一連串的對象,並且每一個低級的對象作為上一級對象的屬性。
比如說,我們要使用"a.b.c"來構建一個命名空間,其實就是先構建一個名字為a的對象,然后構建一個名字為b的對象,並且把這個對象作為a的屬性,同樣把c作為b的一個屬性。即:
var a = new Object();// or var a = {};
a.b = new Object();
a.b.c = new Object();
唯一性
挑選一個獨一無二的命名空間的名字(如Google Maps的G),注意js是大小寫敏感的
不共享
為了不與著名的一些庫或者其他已有的一些函數沖突,使用匿名函數。
(function () {
// your code
}) ();
匿名函數實現了代碼的不共享,該塊中的function和function內部定義的函數都不會被其他地方直接調用到。
一個基本的示例:
(function() {
window['test'] = {}
function $() {
alert("function $ called!");
}
window['test']['$'] = $;
}) ();
function內部的代碼,第一行把test這個命名空間注冊到了window上,中間定義了一個名字為$的內部函數,最后一句把$這個方法注冊到了test這個對象上。
調用時,使用 test.$("xxx") 就可以。