版权声明:本文为博主原创文章,未经博主允许不得转载。 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理解成构造函数了)