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绑定事件不生效的解决方法
Feb 11 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
Mar 27 Javascript
解决ueditor jquery javascript 取值问题
Dec 30 Javascript
Node.js开源应用框架HapiJS介绍
Jan 14 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
JQuery Ajax WebService传递参数的简单实例
Nov 02 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
Nov 25 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
Aug 30 Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 Javascript
vue实现单一筛选、删除筛选条件
Oct 26 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
Nov 12 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/10/09 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
php分页函数示例代码分享
2014/02/24 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHP安全上传图片的方法
2015/03/21 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
node 版本切换的实现
2020/02/02 Javascript
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
Python多线程下载文件的方法
2015/07/10 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
招商专员岗位职责
2014/02/08 职场文书
本科应届生自荐信
2014/06/29 职场文书
机关作风建设自查报告
2014/10/22 职场文书
学前班学生评语
2014/12/29 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
杭白菊导游词
2015/02/10 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
交通安全学习心得体会
2016/01/18 职场文书
Flask response响应的具体使用
2021/07/15 Python
Pandas搭配lambda组合使用详解
2022/01/22 Python