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 ajaxupload插件实现无刷新上传文件
Apr 23 jQuery
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
jQuery:unbind方法的使用详解
Aug 14 jQuery
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
jQuery实现的上传图片本地预览效果简单示例
Mar 29 jQuery
使用jquery的cookie实现登录页记住用户名和密码的方法
Mar 13 jQuery
如何使用CSS3和JQuery easing 插件制作绚丽菜单
Jun 18 jQuery
使用JQuery自动完成插件Auto Complete详解
Jun 18 jQuery
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 jQuery
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
Jquery滑动门/tab切换实现方法完整示例
Jun 05 jQuery
jQuery中getJSON跨域原理的深入讲解
Sep 02 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
德劲1107的电路分析与打磨
2021/03/02 无线电
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
基于js disabled="false"不起作用的解决办法
2013/06/26 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Python字符串替换实例分析
2015/05/11 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
Python调用.NET库的方法步骤
2019/12/27 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
公司成立感言
2014/01/11 职场文书
读书之星事迹材料
2014/05/12 职场文书
应届毕业生自荐书
2014/06/18 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
纪检监察立案决定书
2015/06/24 职场文书
创业计划书之农家乐
2019/10/09 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python