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 相关文章推荐
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
javascript 内存回收机制理解
Jan 17 Javascript
Node.js文件操作详解
Aug 16 Javascript
JQuery实现超链接鼠标提示效果的方法
Jun 10 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 Javascript
javascript实现去除HTML标签的方法
Dec 26 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
JS查找孩子节点简单示例
Jul 25 Javascript
Vue实现页面添加水印功能
Nov 09 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
Jul 17 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
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
Apache服务器无法使用的解决方法
2013/05/08 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
vue.js开发环境搭建教程
2017/05/04 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
详解基于webpack搭建react运行环境
2017/06/01 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
python文件拆分与重组实例
2018/12/10 Python
python如何保证输入键入数字的方法
2019/08/23 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
家长学校工作方案
2014/05/07 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
2015年党建工作总结
2015/03/30 职场文书
交通安全教育心得体会
2016/01/15 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang