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中indexof的用法详细解析
Dec 24 Javascript
基于Jquery实现键盘按键监听
May 11 Javascript
Javascript获取当前时间函数和时间操作小结
Oct 01 Javascript
jQuery实现图片局部放大镜效果
Mar 17 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
Sep 22 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
使用axios请求时,发送formData请求的示例
Oct 29 Javascript
功能完善的小程序日历组件的实现
Mar 31 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
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 空格,换行,跳格使用说明
2009/12/18 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
php xhprof使用实例详解
2019/04/15 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
浅谈python中set使用
2016/06/30 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
python实现微信远程控制电脑
2018/02/22 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
陈胜吴广起义口号
2014/06/20 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
教师工作表现评语
2014/12/31 职场文书