jQuery的框架介绍


Posted in Javascript onMay 11, 2016

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')调用为例:

jQuery的框架介绍

从第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。

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链式调用与show知识浅析,欲了解更多资讯敬请关注三水点靠木网站!

Javascript 相关文章推荐
jQuery Autocomplete自动完成插件
Jul 17 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
Sep 23 Javascript
JavaScript对内存分配及管理机制详细解析
Nov 11 Javascript
js使用栈来实现10进制转8进制与取除数及余数
Jun 11 Javascript
jQuery的css()方法用法实例
Dec 24 Javascript
JavaScript数组随机排列实现随机洗牌功能
Mar 19 Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
Apr 22 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
原生js实现俄罗斯方块
Oct 20 Javascript
微信小程序实现点赞业务
Feb 10 Javascript
jQuery链式调用与show知识浅析
May 11 #Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
May 11 #Javascript
Extjs4.0 ComboBox如何实现三级联动
May 11 #Javascript
javascript简单判断输入内容是否合法的方法
May 11 #Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 #Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
May 10 #Javascript
JavaScript中的原型prototype完全解析
May 10 #Javascript
You might like
第六节--访问属性和方法
2006/11/16 PHP
php xml 入门学习资料
2011/01/01 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
个人找工作自荐信格式
2013/09/21 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
设备售后服务承诺书
2014/05/30 职场文书
销售提升方案
2014/06/07 职场文书
优秀大学生自荐信
2014/06/09 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
小学生表扬稿范文
2015/05/05 职场文书
社区活动总结范文
2015/05/07 职场文书
初中体育教学随笔
2015/08/15 职场文书
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS