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 相关文章推荐
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
Jan 13 Javascript
JavaScript编写推箱子游戏
Jul 07 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
JQuery学习总结【二】
Dec 01 Javascript
原生js编写焦点图效果
Dec 08 Javascript
Javascript实现倒计时(防页面刷新)实例
Dec 13 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
微信小程序选择图片和放大预览图片功能
Nov 02 Javascript
详解Vue-axios 设置请求头问题
Dec 06 Javascript
使用 Element UI Table 的 slot-scope方法
Oct 10 Javascript
p5.js临摹旋转爱心
Oct 23 Javascript
Element Popover 弹出框的使用示例
Jul 26 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
学习PHP session的传递方式
2016/06/15 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
Python求凸包及多边形面积教程
2020/04/12 Python
python中uuid模块实例浅析
2020/12/29 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
办公室文书岗位职责
2013/12/16 职场文书
演讲稿开场白
2014/01/13 职场文书
精神文明单位申报材料
2014/05/02 职场文书
党员政治学习材料
2014/05/14 职场文书
北京申奥口号
2014/06/19 职场文书
圣诞晚会主持词
2015/07/01 职场文书
小学课改工作总结
2015/08/13 职场文书