通過(guò)jQuery源碼學(xué)習(xí)javascript(一)
更新時(shí)間:2012年12月27日 15:44:55 作者:
最近在做日志統(tǒng)計(jì)程序,發(fā)現(xiàn)對(duì)方的程序是在Jquery基礎(chǔ)上進(jìn)行開發(fā)的,而公司的網(wǎng)站的框架是prototype。而且我也早就想了解一下Jquery源碼,故決定研究Jquery源碼,模擬它的方法
Jquery這么普及,必有它過(guò)人之處,通過(guò)開源代碼進(jìn)行學(xué)習(xí),是個(gè)不錯(cuò)的學(xué)習(xí)方法??!
以下是我模擬的方法,我盡量簡(jiǎn)化方法。
定義對(duì)象C(類似于jquery的$方法)——這個(gè)也是jquery設(shè)計(jì)非常巧妙的地方
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
console.log(this);
return this;
},
test : function () {
console.log('test');
}
};
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery = cQuery;
})();
C().test();
輸出結(jié)果
1、把cQuery注冊(cè)到window屬性中,當(dāng)成全局變量使用。用C做為簡(jiǎn)易名稱。
window.C = window.cQuery = cQuery;
2、
cQuery.fn.init.prototype = cQuery.fn;
拿圖說(shuō)話(打印當(dāng)前對(duì)象cQuery):
去掉該句截圖?! ?
init的原型只是當(dāng)前的函數(shù)?!?

用cQuery.fn.init.prototype = cQuery.fn;覆蓋init構(gòu)造器的原型對(duì)象,從而實(shí)現(xiàn)跨域訪問(wèn)。
評(píng)估:
這是一招妙棋,new cQuery.fn.init()創(chuàng)建的新對(duì)象擁有init構(gòu)造器的prototype原型對(duì)象的方法,通過(guò)改變prototype指針的指向,使其指向cQuery類的prototype。——這樣創(chuàng)建出來(lái)的對(duì)象就繼承了cQuery.fn原型對(duì)象定義的方法。
3、用一個(gè)var定義變量,函數(shù)。Jquery源碼里用了79行定義了一連串的變量(在開頭部分)。
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
},
each : function(obj, callback) { // each 方法
var name, length = obj.length;
for (name in obj) {
if (callback.call(obj[name], name, obj[name]) === false) {
break;
}
}
},
isWindow : function(obj) {
return obj != null && obj == obj.window;
}
};
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery =cQuery;
})();
C().each({ Height : 'height', Width : 'width'}, function(name, type){ console.log(this, name, type); });
輸出結(jié)果

難點(diǎn)分析:callback.call(obj[name], name, obj[name])
callback是function(name, type){ console.log(this, name,type);}這個(gè)方法
第一個(gè)obj[name]是"height“或"width"字符串,是callback函數(shù)里的this。
name,第二個(gè)obj[name]是傳給callback的參數(shù)。
isWindow()方法
在上面代碼的基礎(chǔ)上,進(jìn)行編寫:
isWindow : function(obj) {
return obj != null && obj == obj.window;
}
調(diào)用:
console.log(cquery.isWindow(window));
console.log(cquery.isWindow(document));
輸出結(jié)果
總結(jié)
我也是剛開始研究??赡苡行┑胤秸f(shuō)的不是很清楚,如果有人能給我補(bǔ)充,那再好不過(guò)了。
時(shí)間不早了,下回再接著研究。
以下是我模擬的方法,我盡量簡(jiǎn)化方法。
定義對(duì)象C(類似于jquery的$方法)——這個(gè)也是jquery設(shè)計(jì)非常巧妙的地方
復(fù)制代碼 代碼如下:
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
console.log(this);
return this;
},
test : function () {
console.log('test');
}
};
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery = cQuery;
})();
C().test();
輸出結(jié)果

1、把cQuery注冊(cè)到window屬性中,當(dāng)成全局變量使用。用C做為簡(jiǎn)易名稱。
window.C = window.cQuery = cQuery;
2、
cQuery.fn.init.prototype = cQuery.fn;
拿圖說(shuō)話(打印當(dāng)前對(duì)象cQuery):
去掉該句截圖?! ?
填上此句截圖:

init的原型只是當(dāng)前的函數(shù)?!?

用cQuery.fn.init.prototype = cQuery.fn;覆蓋init構(gòu)造器的原型對(duì)象,從而實(shí)現(xiàn)跨域訪問(wèn)。
評(píng)估:
這是一招妙棋,new cQuery.fn.init()創(chuàng)建的新對(duì)象擁有init構(gòu)造器的prototype原型對(duì)象的方法,通過(guò)改變prototype指針的指向,使其指向cQuery類的prototype。——這樣創(chuàng)建出來(lái)的對(duì)象就繼承了cQuery.fn原型對(duì)象定義的方法。
3、用一個(gè)var定義變量,函數(shù)。Jquery源碼里用了79行定義了一連串的變量(在開頭部分)。

復(fù)制代碼 代碼如下:
(function(){
var
_cQuery = window.cQuery,
cQuery = function(){
return new cQuery.fn.init();
};
cQuery.fn = cQuery.prototype = {
init : function () {
return this;
},
each : function(obj, callback) { // each 方法
var name, length = obj.length;
for (name in obj) {
if (callback.call(obj[name], name, obj[name]) === false) {
break;
}
}
},
isWindow : function(obj) {
return obj != null && obj == obj.window;
}
};
cQuery.fn.init.prototype = cQuery.fn;
window.C = window.cQuery =cQuery;
})();
C().each({ Height : 'height', Width : 'width'}, function(name, type){ console.log(this, name, type); });
輸出結(jié)果

難點(diǎn)分析:callback.call(obj[name], name, obj[name])
callback是function(name, type){ console.log(this, name,type);}這個(gè)方法
第一個(gè)obj[name]是"height“或"width"字符串,是callback函數(shù)里的this。
name,第二個(gè)obj[name]是傳給callback的參數(shù)。
isWindow()方法
在上面代碼的基礎(chǔ)上,進(jìn)行編寫:
復(fù)制代碼 代碼如下:
isWindow : function(obj) {
return obj != null && obj == obj.window;
}
調(diào)用:
復(fù)制代碼 代碼如下:
console.log(cquery.isWindow(window));
console.log(cquery.isWindow(document));
輸出結(jié)果

總結(jié)
我也是剛開始研究??赡苡行┑胤秸f(shuō)的不是很清楚,如果有人能給我補(bǔ)充,那再好不過(guò)了。
時(shí)間不早了,下回再接著研究。
您可能感興趣的文章:
- jQuery源碼解讀之hasClass()方法分析
- jQuery源碼解讀之removeAttr()方法分析
- jQuery源碼分析之jQuery.fn.each與jQuery.each用法
- 從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法
- jQuery源碼分析之jQuery中的循環(huán)技巧詳解
- 通過(guò)jQuery源碼學(xué)習(xí)javascript(三)
- 通過(guò)jQuery源碼學(xué)習(xí)javascript(二)
- jQuery中addClass()方法用法實(shí)例
- Jquery.addClass始終無(wú)效原因分析
- jQuery源碼解讀之a(chǎn)ddClass()方法分析
相關(guān)文章
jQuery基于ajax實(shí)現(xiàn)帶動(dòng)畫效果無(wú)刷新柱狀圖投票代碼
這篇文章主要介紹了jQuery基于ajax實(shí)現(xiàn)帶動(dòng)畫效果無(wú)刷新柱狀圖投票代碼,通過(guò)使用jquery動(dòng)態(tài)操作頁(yè)面元素樣式屬性實(shí)現(xiàn)柱狀圖投票效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08
Jquery和JS獲取ul中l(wèi)i標(biāo)簽的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Jquery和JS獲取ul中l(wèi)i標(biāo)簽的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
Javascript函數(shù)中的arguments.callee用法實(shí)例分析
這篇文章主要介紹了Javascript函數(shù)中的arguments.callee用法,結(jié)合實(shí)例形式分析了arguments.callee操作當(dāng)前方法引用的具體技巧,需要的朋友可以參考下2016-09-09
jQuery實(shí)現(xiàn)簡(jiǎn)單的下拉菜單導(dǎo)航功能示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)簡(jiǎn)單的下拉菜單導(dǎo)航功能,涉及jQuery針對(duì)頁(yè)面元素的遍歷與節(jié)點(diǎn)修改相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
jQuery動(dòng)態(tài)生成Bootstrap表格
這篇文章主要介紹了jQuery動(dòng)態(tài)生成bootstrap表格的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11
jQuery選擇器源碼解讀(七):elementMatcher函數(shù)
這篇文章主要介紹了jQuery選擇器源碼解讀(七):elementMatcher函數(shù),本文講解了源碼、功能、參數(shù)、返回函數(shù) 等內(nèi)容,需要的朋友可以參考下2015-03-03
JQuery實(shí)現(xiàn)table行折疊效果以JSON做數(shù)據(jù)源
這篇文章主要介紹JQuery實(shí)現(xiàn)的table行折疊效果并以JSON做數(shù)據(jù)源,需要的朋友可以參考下2014-05-05

