读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的Cookies
Jan 16 Javascript
js location.replace与location.reload的区别
Sep 08 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
jQuery绑定事件的几种实现方式
May 09 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
微信小程序开发之IOS和Android兼容的问题
Sep 26 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
Oct 19 Javascript
JavaScript时间戳与时间日期间相互转换
Dec 11 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
Sep 26 Javascript
vue项目中引入vue-datepicker插件的详解
May 14 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
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python subprocess模块详细解读
2018/01/29 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
中秋寄语大全
2014/04/11 职场文书
大跃进口号
2014/06/16 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
村级个人对照检查材料
2014/08/22 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
2019秋季运动会口号
2019/06/25 职场文书