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图片放大镜效果
Jun 23 jQuery
jQuery事件_动力节点Java学院整理
Jul 05 jQuery
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 jQuery
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
jQuery轻量级表单模型验证插件
Oct 15 jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
jQuery实现的点击显示隐藏下拉菜单功能完整示例
May 17 jQuery
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
jquery分页优化操作实例分析
Aug 23 jQuery
jQuery-App输入框实现实时搜索
Nov 19 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进行MySQL删除记录操作代码
2008/06/07 PHP
php google或baidu分页代码
2009/11/26 PHP
php 字符串替换的方法
2012/01/10 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
html下载本地
2006/06/19 Javascript
JavaScript中Math对象使用说明
2008/01/16 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
js实现精确到秒的倒计时效果
2016/05/29 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
python tornado使用流生成图片的例子
2019/11/18 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Python字符串三种格式化输出
2020/09/17 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
读后感作文评语
2014/12/25 职场文书
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js