读jQuery之一(对象的组成)


Posted in Javascript onJune 11, 2011

对于jQuery的写法甚是困惑,尤其在使用Prototype的$后,一度不能理解jQuery的$。对于现在前端同学来说,可能第一个接触的就是jQuery了,他们会觉得很习惯,很自然。

至今电脑里还存放着当时的API文档,发个图感叹下

读jQuery之一(对象的组成)


在这段时间内,我的入门老师是墨墨,其实至今他仍然是我敬仰的同事之一。他的编程造诣很高,相信早已突破了编程语言的限制。在大家都在使用Prototype.js的时候,在jQuery尚未在国内流行的时候,他就已经把jQuery引入到项目中了。

言归正传吧,目前的jQuery版本已经到了1.6.1。从当时的2000行左右膨胀到了9000行。相信不久就会突破1w行。对于一些简单网页来说引入一个jQuery已经不再那么轻量了。这里的研读的是1.6.1这个版本,我会边读边写,最后会写出一个1000行左右的“迷你jQuery”。


以下是jQuery 1.6.1 代码片段

var jQuery = function( selector, context ) { 
// The jQuery object is actually just the init constructor 'enhanced' 
return new jQuery.fn.init( selector, context, rootjQuery ); 
}, 
... 
class2type = {}; jQuery.fn = jQuery.prototype = { 
constructor: jQuery, 
init: function(selector, context, rootjQuery){ 
} 
} 
// Give the init function the jQuery prototype for later instantiation 
jQuery.fn.init.prototype = jQuery.fn;

初看上去像是在用 原型方式 在写一个类jQuery(别名$),但实际我们使用时是函数调用$("#id"),却不是new $("#id")。
标识符 jQuery是一个function,其内new了一个function init的实例,然后返回。至此我们知道其真正的构造器是jQuery.fn.init。jQuery写的实在诡异,它把init又挂在了jQuery的prototype上,阅读起来有些绕人。

jQuery.fn.init.prototype = jQuery.fn; 是关键的一句。该句把function jQuery的原型赋值给了function init的原型。当调用$("#id")时返回的对象组成包括两个部分。
1,由function init中this带的(如this.context);
2,由function jQuery的prototype带的(如this.size/this.toArray);

模仿jQuery写一个

// zchain-0.1.js 
function $(selector){ 
return new $.prototype.init(selector); 
} 
$.prototype={ 
init:function(selector){ 
if(selector === undefined){ 
this.length = 0; 
return this; 
} 
if(selector.nodeType==1){ 
this[0] = selector; 
}else{ 
this[0]=document.getElementById(selector); 
} 
this.length=1; 
}, 
css:function(name,value){ 
this[0].style[name] = value; 
return this;//链式调用 
}, 
hide:function(){ 
var self=this; 
setTimeout(function(){ 
self[0].style.display="none"; 
},3000); 
return this;//链式调用 
} 
} 
$.prototype.init.prototype=$.prototype;

简单起见,这里选择器只传html element或元素id(后续会增强,但不实现全部css selector),this上挂了length属性,赋值为1。
当我们调用时
var obj = $(); 
console.dir(obj);

$()实际没有什么意义,只是为了测试调用后obj的组成。firebug控制台输出如下:
length:0;
init:function
attr:function
hide:function

即obj对象是由function init中this及function $.prototype组成的。
再看下$.prototype上的方法,我只添加了css和hide方法,这两个方法的实现也是极其简陋的。

<script src="http://files.cnblogs.com/snandy/zchain-0.1.js"></script> 
<div id='content'>3 seconds later I will hide.</div> 
<script type="text/javascript"> 
$("content").css("color","red").hide(); 
</script>

先调用css设置了字体颜色为红色,3秒后隐藏了。
总结下:
jQuery对象指的是jQuery.prototype.init的实例,简单的说就是new jQuery.prototype.init。这里jQuery.prototype.init的类型是function,可以看成是一个类。

jQuery对象由以下部分组成:
1,挂在jQuery.prototype.init中的this上的属性或方法。
2,挂在jQuery.prototype.init.prototype上的属性或方法。
3,因为把jQuery.prototype赋值给了jQuery.prototype.init.prototype,所以挂在jQuery.prototype上的属性和方法也是jQuery对象的一部分。
4,通过jQuery.fn.extend({...})方式扩展的属性或方法(后续提到)。
/201106/yuanma/zchain.rar

Javascript 相关文章推荐
非常好的js代码
Jun 27 Javascript
JavaScript 变量基础知识
Nov 07 Javascript
解决jquery异步按一定的时间间隔刷新问题
Dec 10 Javascript
文本域光标操作的jQuery扩展分享
Mar 10 Javascript
轮播图组件js代码
Aug 08 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
Vue.js2.0中的变化小结
Oct 24 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
jQuery实现模糊搜索功能的方法分析
Jun 29 jQuery
JS使用Prim算法和Kruskal算法实现最小生成树
Jan 17 Javascript
vue实现简单图片上传
Jun 30 Javascript
基于jquery的无刷新分页技术
Jun 11 #Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 #Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 #Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
Jun 08 #Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 #Javascript
精通Javascript系列之数据类型 字符串
Jun 08 #Javascript
精通Javascript系列之Javascript基础篇
Jun 07 #Javascript
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
js类 from qq
2006/11/13 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
javascript基础知识讲解
2017/01/11 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
普通院校学生的自荐信
2013/11/27 职场文书
护士自我介绍信
2014/01/13 职场文书
李敖北大演讲稿
2014/05/24 职场文书
小学亲子活动总结
2014/07/01 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
茶花女读书笔记
2015/06/29 职场文书