读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 相关文章推荐
菜单效果
Oct 14 Javascript
JQuery Easyui Tree的oncheck事件实现代码
May 28 Javascript
jcrop基本参数一览
Jul 16 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
Oct 14 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
jQuery根据name属性进行查找的用法分析
Jun 23 Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 Javascript
微信小程序wx.request实现后台数据交互功能分析
Nov 25 Javascript
基于Vuex无法观察到值变化的解决方法
Mar 01 Javascript
在vue中使用SockJS实现webSocket通信的过程
Aug 29 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 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
在字符串中把网址改成超级链接
2006/10/09 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JS实现购物车特效
2017/02/02 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
layui table 参数设置方法
2018/08/14 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
django项目搭建与Session使用详解
2018/10/10 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
介绍一下内联、左联、右联
2013/12/31 面试题
母亲追悼会答谢词
2014/01/27 职场文书
读书演讲主持词
2014/03/18 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
大学生社会实践感想
2015/08/11 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏