成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? jQuery的框架介紹
全站頭部文字 我要出現在這里
jQuery的框架介紹 621 2024-03-05   

jQuery使用有一段時間了,但是有一些API的實現實在想不通。小編參考相關資料源碼,現在把我的學習過程和收獲分享給大家。

下面將使用簡化的代碼來介紹,主要關注jQuery的實現思想~>_<~

//匿名立即執行函數
//.防止污染全局空間
//.選擇性保護內部變量
(function(window, undefined){
//第二參數undefined設置而不傳的原因:
// 外部發生這種情況:var undefined = 時,undefined會被篡改
// 設置第二參數而不傳,則undefined就會被重置回原來值
function jQuery(sel){
return new jQuery.prototype.init(sel);
}
jQuery.prototype = {
constructor: jQuery,
init: function(sel){
if(typeof sel === 'string'){
var that = this;
//jQuery內部使用的是Sizzle,這里使用querySelectorAll替代
var nodeList = document.querySelectorAll(sel);
Array.prototype.forEach.call(nodeList, function(val, i){
that[i] = val;
})
this.selector = sel;
this.length = nodeList.length;
}
}
}
jQuery.prototype.init.prototype = jQuery.prototype;
//對外暴露jQuery:將jQuery綁定在window上面
window.$ = jQuery;
})(window); 

--------------------------

jQuery一開始使用匿名立即執行函數包裹其內部,并在第5行對外暴露;

所謂的匿名立即執行函數即這個函數是匿名的(沒有名字)、定義完后立即調用的;

當我們在外部調用$("div")時,其實調用的就是內部的jQuery("div");

(function(window, undefined){
//內部變量
//對外暴露jQuery:將jQuery綁定在window上面
window.$ = jQuery;
})(window);
$("div")

--------------------------

好,接下來稍復雜點,下面的代碼主要實現如圖的互相引用:

以$('div')調用為例:

查看圖片

從第2行代碼可以看出,jQuery使用jQuery.prototype.init來實例化jQuery對象,但這會帶來一個問題:

實例化的對象只能訪問到init下的變量,而不能訪問到jQuery.prototype(jQuery對外提供的API綁定在該對象下)。

于是乎,補寫第21行代碼,將init.prototype指向jQuery.prototype即可。

這樣就完成了,使用init來實例化,且可以在init作用域下訪問到jQuery.prototype。

function jQuery(sel){
return new jQuery.prototype.init(sel);
}
jQuery.prototype = {
constructor: jQuery,
init: function(sel){
if(typeof sel === 'string'){
var that = this;
//jQuery內部使用的是Sizzle,這里使用querySelectorAll替代
var nodeList = document.querySelectorAll(sel);
Array.prototype.forEach.call(nodeList, function(val, i){
that[i] = val;
})
this.selector = sel;
this.length = nodeList.length;
}
}
}
jQuery.prototype.init.prototype = jQuery.prototype; 

為什么使用jQuery.prototype.init來實例化對象,而不直接使用jQuery函數呢?

假設使用jQuery函數來實例化對象,這樣對象之間的引用的確可以簡化為 jQuery-->jQuery.prototype。

但是調用會變得繁瑣起來:new $('div'),所以基于這個考慮(猜測(⊙0⊙)),在內部使用較為復雜的實現,來簡化調用。

--------------------------

好,最后,再來看一下init的實現。同樣也簡化了代碼,只實現了最常用的一種情況。

jQuery會把獲取到的nodeList處理成數組(方便后續使用),并在其下掛載一些變量,如length,selector。

查看圖片

init: function(sel){
if(typeof sel === 'string'){
var that = this;
//jQuery內部使用的是Sizzle,這里使用querySelectorAll替代
var nodeList = document.querySelectorAll(sel);
Array.prototype.forEach.call(nodeList, function(val, i){
that[i] = val;
})
this.selector = sel;
this.length = nodeList.length;
}
} 

本文所述到此結束,下篇文章將給大家介紹jQuery鏈式調用與show知識淺析,欲了解更多資訊敬請關注綠夏網網站!



主站蜘蛛池模板: 三年级下册语文第五单元作文奇妙的想象| 妥协电影在线观看完整版中文| 色在线视频| 38在线电影| 整容前后| 影库影片| 地火电视剧38集| 泰诺对乙酰氨基酚缓释片说明书| 电影《瞬间》| 红灯区在线观看完整版| 显示驱动| 天津电视台体育频道节目单| 中国安全生产报| 黄视频在线播放| 周岁封酒| 海滩修学旅程行| 麻烦是朋友| 日本女人洗澡| 王盟| 刀客家族| soldier's heart| 欺辱尤娜| 张小波的个人资料简介| 陈诗雅韩国演员| 寿康宝鉴戒期表| 林正英演的全部电影| 李顺载| 马修| 唐瑜苏沐月是哪部短剧| 草神纳西妲图片| 珍珠少女| 爱很简单简谱| 初号机壁纸| wall.e| 驾驶证三力测试题库| 吉泽明步番号| 阿尔法电影| 大学英语综合教程1答案| 米娅华希科沃斯卡| 老江湖| 被主人调教|

!!!站長長期在線接!!!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103