读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 11 Javascript
JavaScript中对象property的读取和写入方法介绍
Dec 30 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
Jan 13 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
一种新的javascript对象创建方式Object.create()
Dec 28 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
jquery datatable服务端分页
Aug 31 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
阿里大于短信验证码node koa2的实现代码(最新)
Sep 07 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
php注册登录系统简化版
2020/12/28 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
python生成器的使用方法
2013/11/21 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
新品发布会策划方案
2014/06/08 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis