1。總體架構
1.1自調用匿名函數
//自調用匿名函數
(function(window,undefined){
//jquery code
})(window);
1.這是一個自調用匿名函數。第一個括號內創建一個匿名函數,第二個括號,立即執行
2。為什么要創建這樣一個“自調用匿名函數”呢???
通過定義一個匿名函數,創建一個“私有”的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點非常有用也是js框架必須支持的功能,jQuery應用,必須要確保jQuery創建的變量不能和導入他的程序所使用的變量沖突
3.匿名函數從語法上叫函數直接量,javascript語法包括匿名函數的括號,事實上自調用匿名函數有兩種寫法
第一種
(function(){
})(window);
第二種
(function(){
}(window));
4.為什么要傳入window呢?
通過傳入window變量,使得window由全局變量變成局部變量,當在jQuery代碼塊中訪問window時,不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問window,更重要的是,window作為參數傳入,可以壓縮代碼進行優化
(function(a,b){
//window被優化為a
})(window);
5.為什么要在參數列表增加undefined呢??
在自調用匿名函數作用域內,確保undefined是真的未定義,因為undefined能夠被重寫,賦予新的值
undefined = "now it's defined";
alert( undefined );
6.注意到源碼最后的分號了嗎?
分號是可選的,但省略分號,並不是好的編程習慣,為了更好的兼容在每行代碼后加上分號並養成習慣
jQuery() $()
構造函數就是初始化一個實列對象,對象的prototype屬性是繼承一個實列對象、構造函數注意事項
1、默認函數首字母大寫
2、構造函數並沒有顯示返回任何東西。new操作符會自動創建給定的類型並且返回他們,當調用構造函數時,new會自動創建this對象,類型就是構造函數類型
3、也可以在構造函數中顯示調用return.如果返回值是一個對象,他就會替代新創建的對象實列返回,如果返回值是一個原始類型,他就被忽略,新創建實列會被返回。
function Aaa(){}
//一般構造函數
Aaa.prototype.init=function(){alert('init')};
Aaa.prototype.css=function(){alert('css')};
var a1=new Aaa();
a1.init();//初始化
a1.css();
//jquery寫法
function jQuery(){
return new jQuery.prototype.init();
}
jQuery.prototype={
constructor:jQuery,
init:function(){/*初始化*/},
css:function(){console.log('css')}
}
jQuery.prototype.init.prototype=jQuery.prototype;
jQuery().css();
jQuery()->new jQuery.prototype.init();
//把jQuery的原型指向自己的init方法(看做構造函數)的原型上
function jQuery(){
return new jQuery.prototype.init();
}
jQuery.prototype.init = function(){
};
jQuery.prototype.css = function(){
};
jQuery.prototype.init.prototype = jQuery.prototype;
jQuery().css();