jQuery中$原理实例分析

 更新时间:2018年08月13日 10:44:08   作者:筱葭  
这篇文章主要介绍了jQuery中$原理,结合实例形式分析了jQuery中$的原理与运行机制,并具体分析了jQuery对象构造的具体原理,需要的朋友可以参考下

本文实例讲述了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常用插件及用法总结》、《jQuery表格(table)操作技巧汇总》、《jQuery常见经典特效汇总》及《jquery选择器用法总结

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

相关文章

  • jQuery函数的等价原生函数代码示例

    jQuery函数的等价原生函数代码示例

    原生方法明显要比jQuery方法快,因为jQuery方法要处理浏览器兼容以及其他一些事情,如果你针对的是现代浏览器,那么使用原生方法会使性能有很大的提升
    2013-05-05
  • jquery带翻页动画的电子杂志代码分享

    jquery带翻页动画的电子杂志代码分享

    jquery带翻页动画的电子杂志是一款jquery.booklet电子书小册子带翻页动画的电子杂志书本,感兴趣的小伙伴们可以参考一下
    2015-08-08
  • Jquery多选下拉列表插件jquery multiselect功能介绍及使用

    Jquery多选下拉列表插件jquery multiselect功能介绍及使用

    支持点击label实现checkbox组选择,头部选项,如全选/ 取消全选 /关闭功能,支持键盘选择等等,下面与大家分享下具体使用
    2013-05-05
  • jQuery实现打开页面渐现效果示例

    jQuery实现打开页面渐现效果示例

    这篇文章主要介绍了jQuery实现打开页面渐现效果的方法,结合实例形式分析了jQuery样式操作及页面元素的渐变效果实现技巧,需要的朋友可以参考下
    2016-07-07
  • 用jQuery旋转插件jqueryrotate制作转盘抽奖

    用jQuery旋转插件jqueryrotate制作转盘抽奖

    这篇文章主要为大家详细介绍了用jQuery旋转插件jqueryrotate制作转盘抽奖,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • jQuery 性能优化指南(3)

    jQuery 性能优化指南(3)

    前面性能优化已经说过,ID选择器的速度是最快的。所以在HTML代码中,能使用ID的尽量使用ID来代替class。
    2009-05-05
  • jQuery 移除事件的方法

    jQuery 移除事件的方法

    这篇文章主要介绍了jQuery 移除事件的方法,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Jquery AJAX 框架的使用方法

    Jquery AJAX 框架的使用方法

    AJAX 流行之后,总想好好学习一下。但是众多的框架实在难以选择。说明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。
    2009-11-11
  • jquery 简单图片导航插件jquery.imgNav.js

    jquery 简单图片导航插件jquery.imgNav.js

    前几天某MM要偶帮忙实现栗子汀首页的图片导航效果,很简单而且具有通用性的一个需求,点图片A切换图片A相关的内容,点图片B切换图片B相关的内容,仅此而已。
    2010-03-03
  • jQuery 实现扁平式小清新导航

    jQuery 实现扁平式小清新导航

    这篇文章主要介绍了jQuery 实现扁平式小清新导航,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论