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入门学习资料收集整理篇
Jul 06 Javascript
JavaScript 事件记录使用说明
Oct 20 Javascript
jquery中输入验证中一个不错的效果
Aug 21 Javascript
js 删除数组的几种方法小结
Feb 21 Javascript
javascript 动态创建表格的2种方法总结
Mar 04 Javascript
js实现简单选项卡与自动切换效果的方法
Apr 10 Javascript
在Ubuntu系统上安装Node.JS的教程
Oct 15 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
vue resource post请求时遇到的坑
Oct 19 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
JS实现放烟花效果
Mar 10 Javascript
react-router-dom 嵌套路由的实现
May 02 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
?繁体转换的class
2006/10/09 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
Puppet的一些技巧
2018/09/17 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python序列化与数据持久化实例详解
2019/12/20 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python不同系统中打开方法
2020/06/23 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
工程部经理岗位职责
2013/12/08 职场文书
教师党性分析材料
2014/02/04 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
国贸专业求职信
2014/06/28 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书