一、jQuery源码

  在jQuery中,$是jQuery的别名,执行“$()”就是执行“jQuery()”,执行“$()”返回的是一个jQuery对象,在源码中,它是这样定义的:

...
var jQuery = function() {
return new jQuery.fn.init();
}
...
jQuery.fn = jQuery.prototype;

  

  其中,jQuery.fn.init()是一个构造函数,返回的jQuery对象就是通过实例化这个构造函数来创建的,init()在jQuery的原型中被定义:

...
var init = jQuery.fn.init = function() {
...
return this;
}
init.prototype = jQuery.fn;

  init()构造函数最后返回了这个新对象的引用,并用jQuery的原型覆盖了init()的原型。

二、分析

  如果我们的目的是创建一个jQuery类,它包含了一系列方便我们调用的函数,实例化这个类得到jQuery对象,它可以这么写:

var jQuery = function() {
...
}
jQuery.prototype = { ... }
var jq = new jQuery();

  显然,jQuery不是这样玩的,而是使用了无new构造:

var jQuery = function(){
return new init();
}
var init = function(){
...
return this;
}
init.prototype = { ... }
var jq = jQuery();

  但是,为了层次更清晰或者其他原因,jQuery将init()构造函数的定义放在了jQuery.prototype里面,即:

var jQuery = function(){
return new jQuery.prototype.init();
}
jQuery.prototype.init = function() {
  ...
  return this;
}
init.prototype = { ... }

  

  关于为什么这么做的原因可以参考这里的讨论:https://cnodejs.org/topic/53e73361977012ba5590e66d

  此时,还有一个问题:新创建的对象无法访问jQuery.prototype中的其他属性,解决方法是:将jQuery.prototype传递给jQuery.prototype.init.prototype:

var jQuery = function(){
return new jQuery.prototype.init();
}
jQuery.prototype.init = function() {
...
return this;
}
jQuery.prototype.init.prototype = jQuery.prototype;

三、总结

创建jQuery对象的整个流程如下:

1、调用$()方法;

2、调用jQuery.prototype.init()构造函数;

3、根据选择器不同返回不同的jQuery对象;

4、不同jQuery对象中公用的方法写在jQuery.prototype中;

5、将jQuery.prototype传递给jQuery.prototype.init.prototype,这样新创建的对象才可以访问公用方法;

jQuery对象的创建(一)的更多相关文章

  1. jQuery对象的创建

    1.js类库 JavaScript封装了很多的预定义的对象和实用函数,能帮助使用者建立有高难度交互 客户端页面,并且兼容各大浏览器.跑在浏览器,请求服务器 当前比较流行的js库: jquery EXT ...

  2. JQuery源码解析-- 对象的创建

    使用 $("a") 返回的对象就不再是一个简单的DOM对象了,而是一个复杂的JQuery对象. 那么JQuery是怎么创建对象的. 为了便于分析,我将JQuery中复杂的代码简化了 ...

  3. 关于DOM对象与JQuery对象的那些事

    这个问题源自上一次的工作室讨论班,主题是"jQuery选择器的使用",在讨论班的结尾,我留了一个思考题:  jQuery获取到的对象和直接调用原生Javascript方法获得的对象 ...

  4. JavaScript 对象、DOM对象、jquery对象的区别、转换详解

    一.JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 访问对象的属性: [javascrip ...

  5. jquery对象操作

         大类                                JQ方法                      备注 创建元素 var $h1 = $(“<h1>< ...

  6. jQuery.buildFragment源码分析以及在构造jQuery对象的作用

    这个方法在jQuery源码中比较靠后的位置出现,主要用于两处.1是构造jQuery对象的时候使用 2.是为DOM操作提供底层支持,这也就是为什么先学习它的原因.之前的随笔已经分析过jQuery的构造函 ...

  7. jQuery – 7.动态创建Dom、删除节点

    动态创建Dom节点     1.使用$(html字符串)来创建Dom节点     2.append方法用来在元素的末尾追加元素     案例:动态生成网站列表     3.prepend,在元素的开始 ...

  8. 细说jQuery原型的创建和实现原理,并用实例简单模仿

    在解析jQuery实现机理之前,我们先总结一下几点知识,这些都是我学习路上遇到的坑,我跌倒过很多次,现在把它补上: 1)自定义构造函数,如下例: function person(){ this.nam ...

  9. jQuery对象入门级介绍

    你是否曾经见过像  $(".cta").click(function(){})这样的JavaScrip代码?或许你还会思考下 $('#X') 是什么,如果看到这些你都觉得摸不着头脑 ...

随机推荐

  1. H5学习的第三周

    上周,我们结束了京东站的制作,本周我们开始了手机站和响应式网站的学习,并仿制了一个手机端界面和一个响应式界面,在完成这两个网站的过程中我遇到了许多问题,也了解了它们的解决方法,接下来我讲详细介绍本周我 ...

  2. java多线程基本概述(七)——join()方法

    在很多情况下,主线程创建并启动子线程,如果子线程中有大量的耗时运算,主线程将早于子线程结束,如果想让主线程等待子线程结束后再结束,那么我们可以使用join()方法.调用join()方法的意思是当前线程 ...

  3. DOM0 DOM2 DOM3

    DOM0  DOM2  DOM3 DOM是什么 W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容.结构和样式. DOM 定义了访问 HTML 和 ...

  4. React服务器渲染最佳实践

    源码地址:https://github.com/skyFi/dva-starter React服务器渲染最佳实践 dva-starter 完美使用 dva react react-router,最好用 ...

  5. IOS语音录取

    在IOS中,在做语音识别中,需要对语音进行抓取. #import "GetAudioViewController.h" #import <AVFoundation/AVFou ...

  6. 自定义TextView跑马灯

    本篇主要介绍TextView的可控制跑马灯效果实现. Android自带的TextView添加几个属性就可以实现跑马灯效果,大概是这样 android:ellipsize="marquee& ...

  7. Websphere(was)与Weblogic部署EJB的注意项

    复杂的故事简单说,复杂的问题简单做. EJB容器 简介 本节讲解EJB项目在Weblogic和Was上的部署需要注意设置的一些内容.不同的中间件对EJB支持方式不一样,所以配置的原理也略有差异. 关键 ...

  8. 安装node-saas包报错问题

    项目中用到一些sass写的样式,但是每次一编译就报错 按照它上面的提醒,npm rebuild node-sass --force,还是一样有错.不过仔细看看他的错误信息我发现了其中这条: gyp v ...

  9. IntelliJ-项目配置,解决no artifacts的warnings

    1.名词解释 artifacts:是maven中的一个概念,表示项目/modules如何打包,比如jar,war,war exploded,ear等打包形式, 一个项目或者说module有了artif ...

  10. BogoMIPS与calibrate_delay

    在分析Arm+linux启动信息的时候.发现有一个信息竟然耗费了2s的时间,这简直是不能忍受的.这个耗时大鳄是什么东西哪,请看分析信息: [    0.000000] console [ttyMT0] ...