jquery 实现原理二:core.js

这个文件是jquery的核心文件,核心之处在于它定义了如果构造jquery对象,以及如何通过extend来拓展jquery对象(或者叫添加插件),还有一些非常基本的工具方法。

下面是重要代码分析:

一 jQuery对象构造函数

[javascript] view plain copy
  1. jQuery = function( selector, context ) {  
  2.           // The jQuery object is actually just the init constructor 'enhanced'  
  3.           return new jQuery.fn.init( selector, context, rootjQuery );  
  4.      },  

定义了jQuery对象,实际就是一个函数,这个函数返回的是new jQuery.fn.init( selector, context, rootjQuery );,所以jQuery对象就是 jQuery.fn.init实例

二 原型

jquery的原型就是jQuery.fn,所以在fn上添加的方法可以在任何jquery对象中直接调用,extend添加插件也是这个原理
注意其中的关系
[javascript] view plain copy
  1. jQuery.fn = jQuery.prototype = jQuery.fn.init.prototype  
  2. jQuery.constructor = jQuery  
  3. jquery对象就是jQuery.fn.init的实例  
  4. jQuery.fn = jQuery.prototype = {    //  
  5.      // The current version of jQuery being used  
  6.      jquery: version,  
  7.      constructor: jQuery,      //构造函数  
  8.      init: function( selector, context, rootjQuery ) {  
  9.      //这里进入重点,这个init函数就是原型,jQuery函数构造函数。这个函数接收三个参数,分别是选择器,上下文和root,这个root在return new jQuery.fn.init( selector, context, rootjQuery );已经定死了,就是rootjQuery = jQuery( document );,所以实际上只有两个参数可用,就是selector和context。为毛要有rootjQuery呢?应该是防止有多个window时弄错了document,所以在这里要记录下来  
  10.      //下面就是根据selector和context参数的不同,分情况处理,依次处理了如下几种情况  
  11.      //1, selector为空,则直接返回空的jquery对象  
  12.      //2,如果selector是字符串,分如下几种情况  
  13.      //2.1, selector是 '<xxx>'类型的,则直接创建html片段,同时如果context是plainObject则把其中的属性全部赋值给创建出来的html片段  
  14.      //2.2,如果selector是一个id选择器,则直接调用getElementById来选择元素  
  15.      //2.3, 如果context为空,调用rootjQuery.find(selector),如果context是jquery对象,则直接调用context.find(selector)  
  16.      //2.4,到这里,说明context也是一个选择器,则直接调用$(context).find(selector)  
  17.      //3, 如果selector是一个DOMElement,则直接使用,不用去找了  
  18.      //4, 如果selector是一个函数,则在documentready时调用此函数  
  19.      //5,兼容另一种写法,即直接传一个对象 {selector:xxx, context:xxx},至此,init结束使命  
  20.      }  
  21.      //然后是两个重要属性selector和length  
  22.      //然后是数组操作相关的方法get, each, push什么的  
  23.      //fn方法结束  
  24. }  


三 extend方法

这个方法的声明实际是 function extend([boolean deep], target, [obj1], [obj2] …)
第一个参数是可选的,表示是否deepcopy
如果有多个对象,则把第二个以及之后的所有对象的属性添加到第一个对象上,如果只有一个对象,则把这个对象的属性添加到jQuery.fn上,通常我们写插件就是用这个方法。

此方法实现比较简单,不多讲

四 用extend拓展了一堆工具方法

包括
noconfilict:解决冲突
isXXX: 变量类型判断
parseHTML:创建html片段
等等


五 

最后返回new出来的jQuery对象




原文地址:http://blog.csdn.net/lihongxun945/article/details/10304285

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值