读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文件的代码
Jul 18 Javascript
JavaScript 学习笔记(六)
Dec 31 Javascript
jquery时间下拉框小例子
Apr 15 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
Mar 31 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
Vue自定义指令详解
Jul 28 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
javascript 原型与原型链的理解及应用实例分析
Feb 10 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 Javascript
JavaScript中reduce()的5个基本用法示例
Jul 19 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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
python实现在sqlite动态创建表的方法
2015/05/08 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
党员反对四风问题思想汇报
2014/09/12 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
暂停营业通知
2015/04/25 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android