1.命名空間:
js裡面的命名空間就是使用物件的屬性來擴充的。例如,使用者定義一個A對象,A對像下面有B屬性和C屬性,同時B屬性和C屬性又是對象。因此A={B:{},C:{}},這時使用者就可以在B物件和C物件中定義一樣的方法,屬性了。因此B和C就屬於不同的命名空間。我們呼叫B,C物件裡面的方法,就可以透過A.B.like(),A.C.like()呼叫了。當然A屬於window物件中的屬性。
但是有一種情況,例如:boke.jsp頁面引入了jquery.js以及prototype.js(他們都會在window物件中加入$屬性),這時就出現了衝突的情況。
因此jquery.js裡面就有了noConflict()處理衝突。執行流程:頁面先引入prototype,這時prototype會佔有window的$屬性,然後再引入jquery時,jquery會把之前window的$屬性存放在_$中,然後自己使用$屬性。這時,你可以透過$來呼叫jquery的方法。當你現在不需要使用jquery而想使用prototype時,就可以呼叫$.noConflict(),這時$就會恢復成prototype物件。這時你就可以透過$使用prototype方法了。
2.物件擴充:
命名空間物件有了,那我們需要擴充功能。例如:我需要把A物件的屬性和方法全部複製到B物件中。我不用一個一個在B物件中去寫程式碼。
: 瀏覽器下有很多類別數組對象,arguments,document.forms,document.links,form.elements,document.getElementsByTagName,childNodes等(HTMLCollection,NodeList)。
還有一種特殊寫法的自訂物件
此物件寫法,就是jQuery物件的寫法。
我們需要把上述的類別數組物件轉換成數組物件。
[].slice.call方法可以解決。但是舊版IE下的HTMLCollection,NodeList不是Object的子類,不能使用[].slice.call方法。
因此我們可以重寫一個slice方法。
js五種簡單資料型別有:null,undefined,boolean,number,string。
還有複雜的資料類型:Object,Function,RegExp,Date,自訂的對象,例如:Person等。typeof一般用來判斷boolean,number,string,instanceof一般用來判斷物件類型。但它們都有缺陷。例如:firame裡面的陣列實例就不是父視窗的Array的實例,而呼叫instanceof會回傳false。 (這題360校招時問過)。 typeof new Boolean(true) // "object" ,包裝對象。 boolean,number,string三種包裝對象,js高階程式程式設計裡面有講。
有很多人使用typeof document.all來判斷是否為IE,其實這是很危險的,因為此屬性谷歌和火狐也喜歡,所以在谷歌瀏覽器下出現了這個情況:typeof document.all // undefined 但是,document.all //HTMLAllCollection,用typeof判斷是undefined,但是可以讀取此屬性值。
但是現在可以使用Object.prototype.toString.call方法判斷類型。此方法可以直接輸出物件內部的[[Class]]。但IE8及以下的window物件不能使用此方法。可使用 window == document // true document == window // false IE6,7,8下。
nodeType ( 1:元素 Element 2:屬性 attribute 3:文字 Text 9:document)
jquery中判斷類型使用的方法:
5.domReady
js操作dom節點時,頁面必須建立好dom樹才行。因此,通常使用window.onload方法。但是onload方法是等所有資源載入結束後才會執行。而為了讓頁面能更快的回應使用者的操作,我們只需要dom樹建構完畢,就應該使用js操作。而不需要等待所有資源都載入結束(圖片,flash)。
因此出現了DOMContentLoaded事件,Dom樹建置完成後觸發。但是舊版IE不支持,因此就有了hack。
fn メソッドには、すべてのバインドされたイベントの削除が含まれている必要があります。
もちろん、IE でもスクリプト遅延ハックを使用できます。原則として、遅延が指定されたスクリプトは、DOM ツリーが構築されるまで実行されません。ただし、これには追加の js ファイルを追加する必要があり、別のライブラリで使用されることはほとんどありません。
使用原則: ドキュメントに script タグを追加し、script.src = "xxx.js" を使用してスクリプトの onreadystatechange イベントをリッスンし、this.readyState == "complete" のときに fn メソッドを実行します。
つまり、DOM が構築された後、xxx.js が実行され、その this.readyState が完了します。
上記は、JavaScript フレームワーク設計の第 1 章の読書メモです。この章の基本的な内容を誰もがよりよく理解できるように、内容は比較的簡潔です。