jQuery源码解读-part1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012863664/article/details/79180391

整体大致结构

(function(window,undefined){
  (21 , 94) 定义了一些变量和函数 JQuery = function(){};
  (96 , 283)  给JQ对象,添加一些方法和属性
  (285 , 347) extend :JQuery的继承方法
  (349 , 817) JQuery.extend() : 扩展一些工具方法
  (877 , 2856)  Sizzle : 复杂选择器的实现
  (2880 , 3042)  Callbacks :回调对象 :对函数的统一管理
  (3043 , 3183) Deferred :延迟对象 :对异步的统一管理
  (3184 , 3295) support : 功能检测
  (3308 , 3652) data() : 数据缓存
  (3653 , 3797) queue() : 队列管理
  (3803 , 4299) attr() prop() val() addClass()等 :对元素属性的操作
  (4300 , 5128) on()  trigger() :事件操作的相关方法
  (5140 , 6057) DOM操作 :添加、删除、获取、包装、innerHTML、DOM筛选
  (6058 , 6620) css() :样式的操作
  (6621 , 7854) 提交的数据和ajax() :ajax() load() getJson()
  (7855 , 8584) animate() : 运动的方法
  (8585 , 8792) offset() : 位置和尺寸的方法
  (8804 , 8821) JQ支持模块化的模式
  (8826) window.JQuery = window.$ = JQuery; : 对外提供的接口
})(window);

最外层结构:

(function(window, undefined) {
  window.xxx = xxx
})(window)

这里使用了立即执行函数并且将window作为参数传递进去,这里使用参数传递而不是直接在函数体里面使用window的原因是:
(1) 减少作用域链的查找!如果不传参就要一层一层往上找直到顶层对象window
(2) 后期压缩的话,可以将函数体中的window变成w之类的,只要参数传递了window,压缩过后的w保存的对象就是window
将undefined作为参数传递的原因:防止undefined被某些人作为变量进行修改,在IE8以及以下版本中,undefined可以被修改:var undefined = 100;

判断undefined的方式

core_strundefined = typeof undefined

不使用obj==undefined的方式进行判断的原因: 老版本IE,在使用xml节点时会出现问题

jQuery的创建对象的写法

一般情况下我们创建对象的写法是这样的

var a1 = new Aaa();
a1.init();
a1.css();

而在jQuery中,我们可以向下面这样调用方法

$('#aa').css('width', '200');
jQuery('#aa').css('width','200');

jQuery中省略了new这一步,直接通过$或者jQuery后就可以直接调用方法了。也就是说,我们需要在调用$方法的时候,就已经创建一个新对象了,因此看一下jQuery的构造函数是怎么编写的:

function jQuery() {
  return new jQuery.prototype.init();
}
jQuery.prototype.init = function() {};
jQuery.prototype.css = function() {}
jQUery.prototype.init.prototype = jQuery.prototype;

每一次调用$或者jQuery方法时,都会调用init方法返回一个init对象的实例,然后通过最后一行代码,将我们所有在jQuery的原型上添加的内容传递给init对象的prototype属性,这样我们在第二行new出来的对象就具备了init的源性对象上的方法,也就是jQuery的原型对象上的方法(此时可以把init理解成构造函数了)

猜你喜欢

转载自blog.csdn.net/u012863664/article/details/79180391
今日推荐