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 相关文章推荐
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
jquery tab插件精简版分享
Sep 10 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
js的image onload事件使用遇到的问题
Jul 15 Javascript
JavaScript生成福利彩票双色球号码
May 15 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
动态加载权限管理模块中的Vue组件
Jan 16 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
vue+element的表格实现批量删除功能示例代码
Aug 17 Javascript
vue cli3 配置proxy代理无效的解决
Oct 30 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 adodb介绍
2009/03/19 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
Display SQL Server Version Information
2007/06/21 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
详解angular element()方法使用
2017/04/08 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
python怎么提高计算速度
2020/06/11 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
学前教育毕业生自荐信范文
2013/12/24 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
教师年度考核评语
2014/04/28 职场文书
航空学院求职信
2014/06/11 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
联谊会开场白
2015/06/01 职场文书