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中的isNaN函数使用说明
Nov 10 Javascript
提交表单时执行func方法实现代码
Mar 17 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
JavaScript创建对象的写法
Aug 29 Javascript
BootStrap响应式导航条实例介绍
May 06 Javascript
详解自动生成博客目录案例
Dec 09 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
JS实现简单表格排序操作示例
Oct 07 Javascript
vue-cli脚手架引入图片的几种方法总结
Mar 13 Javascript
iView框架问题整理小结
Oct 16 Javascript
vue配置接口域名方法总结
May 12 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 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中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
JS设置获取cookies的方法
2014/01/26 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
详解小程序缓存插件(mrc)
2018/08/17 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
Python的另外几种语言实现
2015/01/29 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
好的自荐信的要求
2013/10/30 职场文书
实习教师自我鉴定
2013/12/09 职场文书
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
安全责任书模板
2014/07/22 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
在职证明范本
2015/06/15 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书