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中clone()函数实现表单中增加和减少输入项
May 13 jQuery
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
Jun 01 jQuery
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
jquery ztree实现右键收藏功能
Nov 20 jQuery
jQuery图片查看插件Magnify开发详解
Dec 25 jQuery
jQuery中的类名选择器(.class)用法简单示例
May 14 jQuery
jquery实现动态改变css样式的方法分析
May 27 jQuery
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
jQuery实现可编辑的表格
Dec 11 jQuery
jQuery实现轮播图效果demo
Jan 11 jQuery
jQuery中event.target和this的区别详解
Aug 13 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
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
Javascript之文件操作
2007/03/07 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
js实现无缝轮播图
2020/03/09 Javascript
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
详解python编译器和解释器的区别
2019/06/24 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
python实现TCP文件传输
2020/03/20 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
python图片合成的示例
2020/11/09 Python
详解pandas映射与数据转换
2021/01/22 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
C#的几个面试问题
2016/05/22 面试题
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
选购到合适的激光打印机
2022/04/21 数码科技