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 相关文章推荐
JS 文件本身编码转换 图文教程
Oct 12 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 Javascript
jquery ui dialog实现弹窗特效的思路及代码
Aug 03 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
Sep 13 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
Nov 17 Javascript
Jquery判断form表单数据是否变化
Mar 30 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 Javascript
值得收藏的vuejs安装教程
Nov 21 Javascript
React Native 截屏组件的示例代码
Dec 06 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
Apr 25 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
Aug 29 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
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
Javascript Object.extend
2010/05/18 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
Python中super的用法实例
2015/05/28 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
python文件路径操作方法总结
2020/12/21 Python
化学教师教学反思
2014/01/17 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
小学课改工作总结
2015/08/13 职场文书
导游词之日月潭
2019/11/05 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript