jQuery源码阅读-全局架构设计的理解
//使用匿名函数自执行的方式设计jQuery整体,使jQuery在引用后就开始立即执行
(function( window, undefined ) {
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context, rootjQuery );
};
jQuery.fn.init.prototype = jQuery.fn;
//详解请看问题四做出的解释
/*
将jQuery的原型指针赋值给jQuery的fn函数指针,这样就会把jQuery原型方法
挂载到jQuery.fn函数指针作用域中,这样的好处是jQuery.fn指针在其他地方
比较容易使用,而且不会影响jQuery原型指针的指向问题。
注意:JavaScript中函数名字可以理解为指针,如果函数名字后面加上括号
可以理解为函数对象,这样理解更为容易一点,因为原生JavaScript
中经常出现函数指针指向设置的问题。
*/
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
length: 0,
size: function() {},
each: function( callback, args ) {}
//在使用上只要是用jQuery选择的对象都可以使用上面这些方法
};
/*
1.将jQuery对象挂载在window的$对象上,把jQuery接口对外公开了
2.jQuery对象成为window下面的一个属性了,可以随便调用了
3.同时为了便于使用jQuery可以用$符号进行使用jQuery
*/
window.jQuery = window.$ = jQuery;
})( window );
1.什么是匿名函数自执行呢?
简单的可以理解为在JavaScript中定义这样的函数定义完成过后就可以自己执行了,如下代码页面加载完成过后就会执行弹出对话框。
(function(){
alert(‘Hello jQuery!‘);
})();
如上述代码将会自动执行,匿名函数自执行的书写方式是:(function(){ //函数体})( /*传递参数*/ );
其中函数体中的代码将会自动执行,而传递参数将会被函数使用。如果还是不理解可以参考这个链接内容 和 这里
2.为什么jQuery在匿名函数自执行中传递window对象呢?
其实在匿名函数中可以直接调用window对象,然而在JavaScript中根据原型链的原理,window处在对象的最顶端查找比较复杂,而对象都是查找离它最近的变量。如果不传递window对象,那么将想外层一层一层的查找,如果传递了window对象那么将使用这个window将明显提升查找速度。(什么是原型链)
3.为什么在匿名函数自执行的方法体中传递undefined参数呢?
在JavaScript中undefined既不是关键字也不是对象,如下代码:
var undefined = 99 ;
/*
各种浏览器执行的结果:chrome:‘undefined‘ ff:‘‘ IE9.10:‘undefined‘ IE8.7.6:‘99‘
*/
alert(undefined);
传递undefined的目的是作为局部变量可以防止外部进行修改,是因为undefined在浏览器的各个版本中表现的情况都不一样,存在兼容性问题,作为局部变量统一传入参数可以解决这个问题。
4.jQuery核心架构思想
如何理解下面的代码呢?
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor ‘enhanced‘
return new jQuery.fn.init( selector, context, rootjQuery );
},
我想下面的代码更容易对这个问题进行阐述:
function MyObject(){}
MyObject.prototype.init = function(){}
MyObject.prototype.css = function(){}
var myObject = new MyObject();
myObject.init();
myObject.css();
上面这种传统方式对于对象的调用非常麻烦。请看下面的代码:
function jQuery(){
return new jQuery.prototype.init();
}
//定义原型下面的函数
jQuery.prototype.init = function(){}
jQuery.prototype.css = function(){}
//修改jQuery对象原型指针的指向
jQuery.prototype.init.prototype = jQuery.prototype ;
//改善过后函数调用的方式更简便了
jQuery().css();
将jQuery的原型引用赋值给jQuery中init初始化方法的原型,这样就将jQuery下的方法引用挂载在jQuery.init()方法下面了
上述是本人的理解,如有错误或者不足之处请提出批评,本人虚心接受同时非常希望和大家交流,谢谢。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。