这节我整理了一下,JQuery的整体构架。
一、打开JQ 2.0.3 我们首先看到的是 一个匿名函数。
(function(window,undefind){
// 代码处理
})(window,undefind)
匿名函数不用过多解释,防止污染全局变量
这里说明一下传递window 和 undefind 的作用
传递window:
1.window是最顶层,做为参数方便查找,提高查询速度。
2. 代码压缩时可以,进行压缩(比如,可以将window 简写为 w)
传递undefind:
1.undefind 是可以被修改的 (例如 undefind = 10 在某些浏览器下,如ie7 8下就可一个被修改)
2. 代码压缩时可以,进行压缩
查看jquery-2.0.3 压缩版本可以看出:
二、架构
1.我们平常利用构造函数封住时,可以这样写
function person(){
}
person.prototype.init = function(){} // 初始化
person.prototype.eatting = function(){}
//调用
var newPerson = new person();
newPerson.init(); // 执行初始化
newPerson.eatting();
但是我们在使用jq 时,我们经常这样调用:
$().show(), JQuery().css()
我们可以看到jq并没有先执行显示的初始化(如上面的 newPerson.init();
)
当然jq 并不是没有初始化,而是这样调用的:
也就是等同与上面的:
function person(){
return person.prototype.init();
}
person.prototype.init = function(){} // 初始化
person.prototype.eatting = function(){}
//调用
var newPerson = new person();
newPerson().eatting(); // 这里newPerson() 就直接初始化了,就像$()一样
但是像上面那样调用有一个问题,方法eatting() 并没有在init() 方法上,而是在person 的原型上,newPerson().eatting() 又是怎样被调用的呢。
JQ是这样处理的:
这里 JQuery.fn 中的fn 就是 prototype,也就是:
JQuery.prototype.init.prototype = JQuery.prototype