jQuery源码学习(一)

有很长一段时间没有更新博客了,近一段时间开始重新梳理知识点和写博客了。重要的事情说三遍,新的博客地址:欢迎访问,新的博客地址:欢迎访问,新的博客地址:欢迎访问。

jQuery的核心理念

  • 简洁的API
  • 优雅的链式
  • 强大的选择器
  • 便捷的操作

jQuery框架的核心就是从HTML文档中匹配元素并对其执行操作

jQuery源码整体放在一个匿名函数执行中

(function(window,undefined){//这里是形参
})(window,undefined);//传入实参

**这样写的好处是:**在匿名函数中定义的变量和函数在匿名函数外部都是访问不到的,在匿名函数中提供对外访问的接口
这里把window当做参数传进来是因为window处于作用域的最顶端,它的查找速度是最慢的。
**好处1:**将window作为实参传递给匿名函数的形参,在匿名函数中可以加快window的查找速度
**好处2:**在压缩版本中window作为实参传递给匿名函数的形参e,通过这样传递,我们知道在压缩代码中e就代表了window
传入undefined,是因为在匿名函数外部undefined可能被修改为其他值,将undefined作为参数传进来,在匿名函数中用到undefined了就是用的传进来的值而不会向外查找了。

方法和属性

####jquery##
用来输出相应的版本号:


####constructor##



####jQuery对象转为dom对象##


####parseHTML##
jQuery.parseHTML用来将字符串转化为数组,返回一个数组


####merge##

script type="text/javascript">
$(function(){
	var arr1 = ['a','b'];
	var arr2 = ['c','d'];
	var arr3 = {
		0:'a',
		1:'b',
		length:2
	};
	//$.merge用来合并数组
	console.log($.merge(arr1,arr2));//["a", "b", "c", "d"]
	//$.merge也可以用来合并json
	//merge在jQuery中可以用来合并json
	console.log($.merge(arr3,arr2));//Object {0: "a", 1: "b", 2: "c", 3: "d", length: 4}
});

####正则匹配##


####makeArray###


    
1
2
3

####pushStack###

    pushStack():JQ对象的入栈
    栈是后进先出,所以这里span的背景颜色变红
    队列是先进先出
    end() 进行出栈操作,来返回栈中的前一个状态



    
    
    pushStack


    
1111111
222222

    
1111111
1111111
1111111
1111111
222222

####map###
返回新集合


    
    

####eq###
first(就是eq(0))和last(就是eq(-1))方法都是基于eq方法来实现的


    
1111111
1111111
1111111
1111111
222222

####toArray()###
toArray()方法用来转数组


    
1
2
3

extend–JQ的继承方法##

###jQuery.extend和jQuery.fn.extend###

  • jQuery.extend 对jQuery本身的属性和方法进行了扩展
  • jQuery.fn.extend 对jQuery.fn的属性和方法进行了扩展

jQuery.extend 调用的时候,this是指向jQuery对象的(jQuery是函数,也是对象!),所以这里扩展在jQuery上。
而jQuery.fn.extend 调用的时候,this指向fn对象,jQuery.fn 和jQuery.prototype指向同一对象,扩展fn就是扩展jQuery.prototype原型对象。这里增加的是原型方法,也就是对象方法了。













###jQuery.extend()用法###
**Demo1:**这个例子只给jQuery.extend()方法传递了一个对象参数,这样会将该对象的所有属性和方法添加到jQuery对象上。



Demo2:



**Demo3:**深拷贝



一篇不错的博文:jQuery.extend 函数详解

jQuery.extend()–扩展一些工具方法

###noConflict()###
jQuery与其他库的防冲突解决


1111111

在jQuery库之前引用$和jQuery






上面代码中在引入jQuery库之前,先将$和jQuery分别赋值。并在jQuery源码中分别将其值保存在私有变量_$和_jQuery中。
当我们引入jQuery库之后:

window.jQuery = window.$ = jQuery;

这样一来,之前$和jQuery的值将被覆盖为jQuery对象。如果不进行冲突处理,将无法访问之前定义的$和jQuery。当使用jQuery防冲突方法后,用我们之前保存在私有变量_$和_jQuery中的值重新给$和jQuery赋值,并将jQuery对象赋值给其他变量。这样一来我们就能够正常访问$和jQuery了。
jQuery在其他库之后引入




	
	
	jQuery与其他库的冲突解决


	
Test-prototype(将被隐藏)
Test-jQuery(将被绑定单击事件)

由于prototype和jQuery中都存在$引用,而jQuery在prototype之后引入,这样一来会导致prototype中的$无法使用。所以,这里我们jQuery的防冲突方法,使得jQuery放弃了$。这样一来,就可以在prototype中正常使用$了。
注意:

window.jQuery = window.$ = jQuery;

这里虽然jQuery放弃了$,但是可以使用window.jQuery来使用jQuery对象。
自定义快捷方式




	
	
	jQuery与其他库的冲突解决


	
Test-prototype(将被隐藏)
Test-jQuery(将被绑定单击事件)

如果不想给jQuery自定义备用名称,还想使用 而 不 管 其 他 库 的 而不管其他库的 ()方法,同时又不想与其他库相冲突,我们可以这样来解决




	
	
	jQuery与其他库的冲突解决


	
Test-prototype(将被隐藏)
Test-jQuery(将被绑定单击事件)

jQuery在其他库之前引入




	
	
	jQuery与其他库的冲突解决


	
Test-prototype(将被隐藏)
Test-jQuery(将被绑定单击事件)

相应的源码:

	//防止冲突
	noConflict: function( deep ) {
		if ( window.$ === jQuery ) {
			window.$ = _$;//将私有变量_$赋值给对外接口window.$,这里jQuery就放弃了$
		}
		//当传递参数的时候
		if ( deep && window.jQuery === jQuery ) {
			window.jQuery = _jQuery;//将私有变量_jQuery赋值给对外接口window.jQuery,这里jQuery就放弃了jQuery
		}
		return jQuery;
	}

###expando###
expando用来生成一个随机字符串
在数据缓存、事件操作、aJax都用到这个来生成随机字符串





待续。。。

你可能感兴趣的:(jQuery)