jQuery中$原理实例分析


Posted in jQuery onAugust 13, 2018

本文实例讲述了jQuery中$原理。分享给大家供大家参考,具体如下:

1、外层沙箱及命名空间$

为了避免声明了一些全局变量而污染,把代码放在一个“沙箱执行”,jQuery具体的实现,都被包含在了一个立即执行函数构造的闭包里面,然后在暴露出命名空间(可以为API,函数,对象),如只暴露 $ 和 jQuery 这2个变量给外界:

(function(window, undefined) {
  // 用一个函数域包起来,就是所谓的沙箱
    // 在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局
  // 把当前沙箱需要的外部变量通过函数参数引入进来
    // 只要保证参数对内提供的接口的一致性,还可以随意替换传进来的这个参数
  "use strict";
  window.jQuery = window.$ = jQuery;
  ... // jQuery代码
}) (window);

jQuery有一个针对压缩优化细节,在代码压缩时,window和undefined都可以压缩为1个字母且确保它们就是window和undefined。外层函数只传了一个参数,因此沙箱执行时,u自然会undefined,把9个字母缩成1个字母,可以看出压缩后的代码减少一些字节数。

// 压缩策略
// w -> window , u -> undefined
(function(w, u) {
  "use strict";
  w.jQuery = w.$ = jQuery;
  var a;
  if (a == u)
    return;
})(window);

2、jQuery 无 new 构造

实例化一个jQuery对象的方法:

$('#text').text('myJQuery'); // 无 new 构造

等价于:

var text = new $('#text');
text.text('myJQuery');

使用jQuery时一般都使用无new的构造方式,直接$('')进行构造,这也是jQuery十分便捷的一个地方。当使用无new构造方式时,其本质是相当于new jQuery(),在jQuery内部的实现方式是:

(function(window, undefined) {
  // ...
  jQuery = function(selector, context) {
    // 实例化方法jQuery()实际上是调用了其拓展的原型方法 jQuery.fn.init
    return new jQuery.fn.init(selector, context, rootjQuery);
  },
  // jQuery.prototype是jQuery的原型,挂载在上面的方法,即可让所有生成的jQuery对象使用
  jQuery.fn = jQuery.prototype = {
    // 实例化方法,这个方法可以称作 jQuery 对象构造器
    init: function(selector, context, rootjQuery) {
          // ...
    }
  }
  // jQuery 没有使用 new 运算符将 jQuery 实例化,而是直接调用其函数
  // 要实现这样,那么 jQuery 就要看成一个类,且返回一个正确的实例,且实例还要能正确访问 jQuery 类原型上的属性与方法
  // jQuery 的方式是通过原型传递解决问题,把 jQuery 的原型传递给jQuery.prototype.init.prototype,所以通过这个方法生成的实例 this 所指向的仍然是 jQuery.fn,所以能正确访问 jQuery 类原型上的属性与方法
  jQuery.fn.init.prototype = jQuery.fn;
})(window);

1) 使用$('xxx')这种实例化方式,其内部调用的是 return new jQuery.fn.init(selector, context, rootjQuery) 这一句话,也就是构造实例是交给了 jQuery.fn.init() 方法去完成。

2) 将 jQuery.fn.initprototype 属性设置为 jQuery.fn,那么使用 new jQuery.fn.init() 生成的对象的原型对象就是 jQuery.fn ,所以挂载到 jQuery.fn 上面的函数就相当于挂载到 jQuery.fn.init() 生成的 jQuery 对象上,所有使用 new jQuery.fn.init() 生成的对象也能够访问到 jQuery.fn 上的所有原型方法。

3) 实例化方法存在这么一个关系链 :

① jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype ;

② new jQuery.fn.init() 相当于 new jQuery() ;

③ jQuery() 返回的是 new jQuery.fn.init(),而 var obj = new jQuery(),所以这 2 者是相当的,所以我们可以无 new 实例化 jQuery 对象。

希望本文所述对大家jQuery程序设计有所帮助。

jQuery 相关文章推荐
jquery中封装函数传递当前元素的方法示例
May 05 jQuery
jquery append与appendTo方法比较
May 24 jQuery
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 jQuery
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
jQuery实现的事件绑定功能基本示例
Oct 11 jQuery
简单实现jQuery弹窗效果
Oct 30 jQuery
jQuery位置选择器用法实例分析
Jun 28 jQuery
jQuery中DOM常见操作实例小结
Aug 01 jQuery
使用jQuery实现掷骰子游戏
Oct 24 jQuery
jquery实现轮播图特效
Apr 12 jQuery
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
深入浅析angular和vue还有jquery的区别
Aug 13 #jQuery
jQuery的Ajax接收java返回数据方法
Aug 11 #jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 #jQuery
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 #jQuery
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 #jQuery
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 #jQuery
jQuery 实现批量提交表格多行数据的方法
Aug 09 #jQuery
You might like
短波的认识
2021/03/01 无线电
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JQUERY获取form表单值的代码
2010/07/17 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
详解使用Python处理文件目录的相关方法
2015/10/16 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
基于python实现简单日历
2018/07/28 Python
python3实现多线程聊天室
2018/12/12 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
windows支持哪个版本的python
2020/07/03 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
品牌宣传方案
2014/03/21 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
停车场管理协议书范本
2014/10/08 职场文书
网络营销计划
2015/01/17 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
MySQL添加索引特点及优化问题
2022/07/23 MySQL