jQuery对象的创建(一)
一、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对象的创建(一)的更多相关文章
- jQuery对象的创建
1.js类库 JavaScript封装了很多的预定义的对象和实用函数,能帮助使用者建立有高难度交互 客户端页面,并且兼容各大浏览器.跑在浏览器,请求服务器 当前比较流行的js库: jquery EXT ...
- JQuery源码解析-- 对象的创建
使用 $("a") 返回的对象就不再是一个简单的DOM对象了,而是一个复杂的JQuery对象. 那么JQuery是怎么创建对象的. 为了便于分析,我将JQuery中复杂的代码简化了 ...
- 关于DOM对象与JQuery对象的那些事
这个问题源自上一次的工作室讨论班,主题是"jQuery选择器的使用",在讨论班的结尾,我留了一个思考题: jQuery获取到的对象和直接调用原生Javascript方法获得的对象 ...
- JavaScript 对象、DOM对象、jquery对象的区别、转换详解
一.JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 访问对象的属性: [javascrip ...
- jquery对象操作
大类 JQ方法 备注 创建元素 var $h1 = $(“<h1>< ...
- jQuery.buildFragment源码分析以及在构造jQuery对象的作用
这个方法在jQuery源码中比较靠后的位置出现,主要用于两处.1是构造jQuery对象的时候使用 2.是为DOM操作提供底层支持,这也就是为什么先学习它的原因.之前的随笔已经分析过jQuery的构造函 ...
- jQuery – 7.动态创建Dom、删除节点
动态创建Dom节点 1.使用$(html字符串)来创建Dom节点 2.append方法用来在元素的末尾追加元素 案例:动态生成网站列表 3.prepend,在元素的开始 ...
- 细说jQuery原型的创建和实现原理,并用实例简单模仿
在解析jQuery实现机理之前,我们先总结一下几点知识,这些都是我学习路上遇到的坑,我跌倒过很多次,现在把它补上: 1)自定义构造函数,如下例: function person(){ this.nam ...
- jQuery对象入门级介绍
你是否曾经见过像 $(".cta").click(function(){})这样的JavaScrip代码?或许你还会思考下 $('#X') 是什么,如果看到这些你都觉得摸不着头脑 ...
随机推荐
- [编织消息框架][JAVA核心技术]动态代理应用9-扫描class
之前介绍的annotationProcessor能在编译时生成自定义class,但有个缺点,只能每次添加/删除java文件才会执行,那天换了个人不清楚就坑大了 还记得之前介绍的编译时处理,懒处理,还有 ...
- 用 parseInt()解决的 小 bug
在做轮播模块的时候遇到问题是:你在 连续指示小按钮 时候再去 只有 点击 下一张按钮,出现bug: 指示小按钮的 className 当前显示的 calssName 为 undefined ! // ...
- php7 redis扩展编译安装
提示:php7版本不支持redis2点几的扩展 上正文: wget -c https://github.com/phpredis/phpredis/archive/php7.zip unzip php ...
- java复习(2)---java基础杂记
java命名规范: 参考:http://www.cnblogs.com/maowang1991/archive/2013/06/29/3162366.html 1.项目名小写 2.包名小写 3.类名每 ...
- JS Dom节点操作demo!
通过黑马课程的学习,在这里分享一个js Dom中节点操作的小练习 需求:使用js创建一个4*3的表格table. onload = function(){ function c(tagName){ r ...
- angular 实现自定义样式下拉菜单
自己闲着没事写了一个自定义的下拉菜单希望和大家交流一下!望能和大神们成为朋友. 下面上代码: <!doctype html> <html lang="en" ng ...
- 工资不高也要给自己放假 这几款APP估计你用得上
我是这样的一个人,我宁愿工资不高,只要给我足够的假期,那我就满足了.都说上班就是为了赚钱,但如果身体不好,赚再多的钱也是无福享受,所以建议各位,有机会的话,一定要抽出时间去旅游,去放松. 现在我们外出 ...
- JS模式---发布、订阅模式
发布订阅模式又叫观察者模式,它定义一种一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. document.body.addEventListener('click', ...
- 使用Express开发个人网站(一)
Express,基于Node.js平台,快速.开放.极简的 web 开发框架. Node的出现,让js有了运行在服务器端的可能,基于此的Express,可以快速,简单的搭建起一个服务器与个人网站. 安 ...
- 阿里云CentOS7.2服务器的安装
第一步:下载服务器系统ISO安装文件 我使用的是阿里云的镜像:因为阿里云的服务在国内相对比较成熟 服务器镜像下载如下:http://mirrors.aliyun.com/centos/7/isos/x ...