读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 相关文章推荐
javascript中利用数组实现的循环队列代码
Jan 24 Javascript
Script的加载方法小结
Jan 12 Javascript
用js判断页面是否加载完成实现代码
Dec 11 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
Vue组件实例间的直接访问实现代码
Aug 20 Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 Javascript
JavaScript 高性能数组去重的方法
Sep 20 Javascript
用图片替换checkbox原始样式并实现同样的功能
Nov 15 Javascript
vue + element-ui的分页问题实现
Dec 17 Javascript
JavaScript对象属性操作实例解析
Feb 04 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 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
php调用google接口生成二维码示例
2014/04/28 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
[JS]点出统计器
2020/10/11 Javascript
JavaScript 事件参考手册
2008/12/24 Javascript
关于js类的定义
2011/06/28 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
DOM 高级编程
2015/05/06 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
破解安装Pycharm的方法
2018/10/19 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
Python变量类型知识点总结
2019/02/18 Python
python文本数据处理学习笔记详解
2019/06/17 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
介绍一下linux的文件系统
2015/10/06 面试题
指导教师评语
2014/04/26 职场文书
2014年体育部工作总结
2014/11/13 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
AJAX学习笔记
2021/05/18 Javascript