通過(guò)jQuery源碼學(xué)習(xí)javascript(三)
更新時(shí)間:2012年12月27日 16:13:22 作者:
承接上兩篇繼續(xù)寫下去。我盡量把我明白的地方給大家說(shuō)清楚。有些大家的提問(wèn)我也有點(diǎn)搞不明白,如果有人能解答,再好不過(guò)了
疑問(wèn)
第一篇中有位博友提出了以下的問(wèn)題,我也不太明白,如果有明白的,能否告知一、二。
var str = "test";
for(var a in str){
console.log(a + ":" + str[ a ]);
}
輸出結(jié)果
這是一個(gè)字符串對(duì)象,在使用for的時(shí)候,會(huì)出現(xiàn)上面的情況。
(function(window, undefined){
// jquery code
})(window);
代碼解析:
第一個(gè)括號(hào):創(chuàng)建一個(gè)匿名函數(shù)。
第二個(gè)括號(hào):立即執(zhí)行。
傳入window變量原因:
使window變量由全局變量變?yōu)榫植孔兞?,不需要將作用域鏈回退到頂層作用域,以便更快的訪問(wèn)window。
在參數(shù)列表中增加undefined原因:
在自調(diào)用匿名函數(shù)的作用域內(nèi),確保undefined是真的未定義。
這樣設(shè)計(jì)的好處:
創(chuàng)建私有命名空間。函數(shù)體內(nèi)的變量和方法,不會(huì)影響全局空間。不會(huì)與其他程序的變量發(fā)生沖突。
功能擴(kuò)展extend()
根據(jù)一般的設(shè)計(jì)習(xí)慣,可以直接通過(guò)點(diǎn)(.)語(yǔ)法實(shí)現(xiàn),或者在prototype對(duì)象結(jié)構(gòu)中增加一個(gè)屬性即可?!猨Query框架是通過(guò)extend()函數(shù)來(lái)實(shí)現(xiàn)功能擴(kuò)展的。
我們也做個(gè)類似的方法?!阎付▍?shù)對(duì)象包含的所有屬性復(fù)制給cQuery或cQuery.prototype對(duì)象。
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
}
};
cQuery.fn.init.prototype = cQuery.fn;
cQuery.extend = cQuery.fn.extend = function( obj ) {
for (var prop in obj) {
this[ prop ] = obj[ prop ];
}
return this;
}
cQuery.fn.extend({
test : function() {
console.log('測(cè)試!');
}
});
window.C = window.cQuery = cQuery;
})();
// 調(diào)用方式
C().test();
好處:
1、方便用戶快速擴(kuò)展jQuery框架的功能,不會(huì)破壞jQuery框架的原型結(jié)構(gòu)。
2、方便管理。
注意:
通過(guò)prototype擴(kuò)展的對(duì)象,我們必須通過(guò)實(shí)例化函數(shù)來(lái)調(diào)用(如cQuery().test(),而不能使用cQuery.test())
對(duì)象url參數(shù)化param()
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
}
};
cQuery.param = function(obj) {
var prefix, s = [];
for ( prefix in obj ) {
s[ s.length ] = encodeURIComponent( prefix ) + "=" + encodeURIComponent( obj[ prefix ]);
}
return s.join( "&" );
}
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery = cQuery;
})();
var param = cQuery.param({"name":"chuanshanjia", "age":30});
console.log( param );
輸出結(jié)果
總結(jié)
暫時(shí)寫到這里,如果大家有所補(bǔ)充,那最好不過(guò)了?!蠹叶嘟涣骰ハ鄬W(xué)習(xí)下。
第一篇中有位博友提出了以下的問(wèn)題,我也不太明白,如果有明白的,能否告知一、二。

復(fù)制代碼 代碼如下:
var str = "test";
for(var a in str){
console.log(a + ":" + str[ a ]);
}
輸出結(jié)果
這是一個(gè)字符串對(duì)象,在使用for的時(shí)候,會(huì)出現(xiàn)上面的情況。

復(fù)制代碼 代碼如下:
(function(window, undefined){
// jquery code
})(window);
代碼解析:
第一個(gè)括號(hào):創(chuàng)建一個(gè)匿名函數(shù)。
第二個(gè)括號(hào):立即執(zhí)行。
傳入window變量原因:
使window變量由全局變量變?yōu)榫植孔兞?,不需要將作用域鏈回退到頂層作用域,以便更快的訪問(wèn)window。
在參數(shù)列表中增加undefined原因:
在自調(diào)用匿名函數(shù)的作用域內(nèi),確保undefined是真的未定義。
這樣設(shè)計(jì)的好處:
創(chuàng)建私有命名空間。函數(shù)體內(nèi)的變量和方法,不會(huì)影響全局空間。不會(huì)與其他程序的變量發(fā)生沖突。
功能擴(kuò)展extend()
根據(jù)一般的設(shè)計(jì)習(xí)慣,可以直接通過(guò)點(diǎn)(.)語(yǔ)法實(shí)現(xiàn),或者在prototype對(duì)象結(jié)構(gòu)中增加一個(gè)屬性即可?!猨Query框架是通過(guò)extend()函數(shù)來(lái)實(shí)現(xiàn)功能擴(kuò)展的。
我們也做個(gè)類似的方法?!阎付▍?shù)對(duì)象包含的所有屬性復(fù)制給cQuery或cQuery.prototype對(duì)象。
復(fù)制代碼 代碼如下:
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
}
};
cQuery.fn.init.prototype = cQuery.fn;
cQuery.extend = cQuery.fn.extend = function( obj ) {
for (var prop in obj) {
this[ prop ] = obj[ prop ];
}
return this;
}
cQuery.fn.extend({
test : function() {
console.log('測(cè)試!');
}
});
window.C = window.cQuery = cQuery;
})();
// 調(diào)用方式
C().test();
好處:
1、方便用戶快速擴(kuò)展jQuery框架的功能,不會(huì)破壞jQuery框架的原型結(jié)構(gòu)。
2、方便管理。
注意:
通過(guò)prototype擴(kuò)展的對(duì)象,我們必須通過(guò)實(shí)例化函數(shù)來(lái)調(diào)用(如cQuery().test(),而不能使用cQuery.test())
對(duì)象url參數(shù)化param()
復(fù)制代碼 代碼如下:
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
}
};
cQuery.param = function(obj) {
var prefix, s = [];
for ( prefix in obj ) {
s[ s.length ] = encodeURIComponent( prefix ) + "=" + encodeURIComponent( obj[ prefix ]);
}
return s.join( "&" );
}
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery = cQuery;
})();
var param = cQuery.param({"name":"chuanshanjia", "age":30});
console.log( param );
輸出結(jié)果

總結(jié)
暫時(shí)寫到這里,如果大家有所補(bǔ)充,那最好不過(guò)了?!蠹叶嘟涣骰ハ鄬W(xué)習(xí)下。
您可能感興趣的文章:
- jQuery源碼解讀之a(chǎn)ddClass()方法分析
- jQuery源碼解讀之hasClass()方法分析
- jQuery源碼解讀之removeAttr()方法分析
- jQuery源碼分析之jQuery.fn.each與jQuery.each用法
- 從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法
- jQuery源碼分析之jQuery中的循環(huán)技巧詳解
- 通過(guò)jQuery源碼學(xué)習(xí)javascript(二)
- jQuery中removeClass()方法用法實(shí)例
- 使用JS實(shí)現(xiàn)jQuery的addClass, removeClass, hasClass函數(shù)功能
- jQuery源碼解讀之removeClass()方法分析
相關(guān)文章
jQuery插件jRumble實(shí)現(xiàn)網(wǎng)頁(yè)元素抖動(dòng)
jRumble是jquery的插件,可以讓你選擇的元素抖動(dòng)。 調(diào)用時(shí)只需一句代碼即可,有些抖動(dòng)效果還挺可愛(ài),可自定義的抖動(dòng)效果,十分的炫酷,有需要的小伙伴可以參考下。2015-06-06
jQuery基于ajax實(shí)現(xiàn)頁(yè)面加載后檢查用戶登錄狀態(tài)的方法
這篇文章主要介紹了jQuery基于ajax實(shí)現(xiàn)頁(yè)面加載后檢查用戶登錄狀態(tài)的方法,結(jié)合實(shí)例形式較為詳細(xì)分析了jQuery結(jié)合ajax進(jìn)行表單登陸驗(yàn)證操作的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
jQuery實(shí)現(xiàn)點(diǎn)擊DIV同時(shí)點(diǎn)擊CheckBox,并為DIV上背景色的實(shí)例
下面小編就為大家分享一篇jQuery實(shí)現(xiàn)點(diǎn)擊DIV同時(shí)點(diǎn)擊CheckBox,并為DIV上背景色的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
解決jquery無(wú)法找到其他父級(jí)子集問(wèn)題的方法
這篇文章主要為大家詳細(xì)介紹了解決jquery無(wú)法找到其他父級(jí)子集問(wèn)題的方法,感興趣的小伙伴們可以參考一下2016-05-05
jQuery插件HighCharts繪制2D圓環(huán)圖效果示例【附demo源碼下載】
這篇文章主要介紹了jQuery插件HighCharts繪制2D圓環(huán)圖效果,結(jié)合實(shí)例形式分析了jQuery使用HighCharts插件繪制圓環(huán)圖的實(shí)現(xiàn)步驟與相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-03-03
jquery實(shí)現(xiàn)ajax提交表單信息的簡(jiǎn)單方法(推薦)
下面小編就為大家?guī)?lái)一篇jquery實(shí)現(xiàn)ajax提交表單信息的簡(jiǎn)單方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08

