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 禁止鼠标右键并监听右键事件
Apr 27 jQuery
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
浅谈jQuery框架Ajax常用选项
Jul 08 jQuery
基于jQuery实现的单行公告活动轮播效果
Aug 23 jQuery
基于jQuery的左滑出现删除按钮的示例
Aug 29 jQuery
利用JQuery操作iframe父页面、子页面的元素和方法汇总
Sep 10 jQuery
jQuery EasyUI开发技巧总结
Sep 26 jQuery
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
jquery实现抽奖功能
Oct 22 jQuery
ajax jquery实现页面某一个div的刷新效果
Mar 04 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
php inc文件使用的风险和注意事项
2013/11/12 PHP
PHP加密解密类实例分析
2015/04/20 PHP
浅谈PHP的反射API
2017/02/26 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
express的中间件basicAuth详解
2014/12/04 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python 26进制计算实现方法
2015/05/28 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
Django日志及中间件模块应用案例
2020/09/10 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
创先争优个人承诺书
2014/08/30 职场文书
投标邀请书范本
2015/02/02 职场文书
负责培养人意见
2015/06/05 职场文书
初中班主任教育随笔
2015/08/15 职场文书
信息技术课教学反思
2016/02/23 职场文书
Android 中的类文件和类加载器详情
2022/06/05 Java/Android