`

jQuery的链式语法实现

阅读更多

        一个很老的话题,只是自己做下记录,免得忘记。写得比较简单还请见谅,有不对的地方也请告知,多谢:) jQuery的版本2.1.1pre

如何生成一个jQuery对象呢?

直接调用$(selector, context)即可,让我们来看看源码都做了什么

// Define a local copy of jQuery
jQuery = function( selector, context ) {
	// The jQuery object is actually just the init constructor 'enhanced'
	// Need init if jQuery is called (just allow error to be thrown if not included)
	return new jQuery.fn.init( selector, context );
},

 

        实例化一个jQuery.fn.init对象(别看那么长的名字,就当成是一个function name就行),那在这个构造函数里都做了什么呢?

    init = jQuery.fn.init = function( selector, context ) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if ( !selector ) {
			return this;
		}

		........

		if ( selector.selector !== undefined ) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray( selector, this );
	};

 其实就是返回来一个伪数组的自身实例,也就是jQuery.fn.init的实例,这也就是我们常用到的jQuery对象。

那jQuery怎么实现链式语法呢?

 我们接着源码往下看,下面这句是关键。

// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;

         也就是jQuery.fn.init的实例都拥有jQuery.fn相应的方法,也就是我们所使用的方法都在这个上面。那jQuery.fn最开始是什么样的?没有jQuery.fn也就没有jQuery.fn.init。

jQuery.fn = jQuery.prototype = {
	// The current version of jQuery being used
	jquery: version,

	constructor: jQuery,

	// Start with an empty selector
	selector: "",

	// The default length of a jQuery object is 0
	length: 0,

	toArray: function() {
		return slice.call( this );
	},

	.....................
};

 这就是他的赋值来,相当于一个Object对象。那怎么给他新增方法呢?看看他给我们提供了什么?

jQuery.extend = jQuery.fn.extend = function() {
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[0] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
		target = {};
	}

	// extend jQuery itself if only one argument is passed
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null ) {
			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray(src) ? src : [];

					} else {
						clone = src && jQuery.isPlainObject(src) ? src : {};
					}

					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

        通过extend可以扩展方法,其中jQuery.extend是给jQuery扩展方法,这个我的理解他就像一个工具类比如我们常用的$.each,$.trim等都源自于此。而jQuery.fn.extend则相当于给我们的jQuery对象扩展方法,上下文就是jQuery.fn.init实例对象本身,链式中方法都源自于此。

既然是链式语法,那方法调用后都返回了什么呢?

 很显然的就是jQuery对象自身,我们看看removeAttr的实现

jQuery.fn.extend({
	attr: function( name, value ) {
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
	},

	removeAttr: function( name ) {
		return this.each(function() {
			jQuery.removeAttr( this, name );
		});
	}
});

 

jQuery.fn = jQuery.prototype = {
	.....................

	// Execute a callback for every element in the matched set.
	// (You can seed the arguments with an array of args, but this is
	// only used internally.)
	each: function( callback, args ) {
		return jQuery.each( this, callback, args );
	},
        .....................
}

 从之前的init.prototype = jQuery.fn;可以看出this实际上就是init的实例。

jQuery.extend({
               ..................................
               // args is for internal usage only
	each: function( obj, callback, args ) {
		var value,
			i = 0,
			length = obj.length,
			isArray = isArraylike( obj );

		if ( args ) {
			if ( isArray ) {
				for ( ; i < length; i++ ) {
					value = callback.apply( obj[ i ], args );

					if ( value === false ) {
						break;
					}
				}
			} else {
				for ( i in obj ) {
					value = callback.apply( obj[ i ], args );

					if ( value === false ) {
						break;
					}
				}
			}

		// A special, fast, case for the most common use of each
		} else {
			if ( isArray ) {
				for ( ; i < length; i++ ) {
					value = callback.call( obj[ i ], i, obj[ i ] );

					if ( value === false ) {
						break;
					}
				}
			} else {
				for ( i in obj ) {
					value = callback.call( obj[ i ], i, obj[ i ] );

					if ( value === false ) {
						break;
					}
				}
			}
		}

		return obj;
	},
      .....................
}

       直接看返回的结果obj, 他就是之前传入的this参数,也就是jQuery.fn.init的实例对象,removeAttr最后调用this.each返回的就是这个对象。这个对象拥有着jQuery.fn上的所有方法,所以我们还能接着调用jQuery的方法。

 

分享到:
评论

相关推荐

    jQuery的各种实例的编写 教你很快掌握jQuery的语法

    本教程将通过一系列实例,帮助你快速理解并掌握jQuery的语法。 一、选择器(Selectors) jQuery的选择器是其强大的功能之一,它们基于CSS选择器,允许你精准地选取页面中的元素。例如,`$("#id")`用于选取ID为"id...

    jQuery第5天知识点:隐式迭代、链式编程、jQuery插件.7z

    现在,我们将详细讲解“隐式迭代”、“链式编程”以及“jQuery插件”。 1. **隐式迭代**: jQuery的一个显著特性是它的选择器功能,它允许开发者通过CSS选择器轻松地选取DOM元素。当一个jQuery对象被创建后,所有...

    editplus html5 css3 JQuery 语法文件html5 css3.0 jQueryAPI手册

    1. **选择器**:JQuery的链式语法和丰富的选择器简化了DOM元素的选择。 2. **DOM操作**:如`$(selector).html()`, `append()`, `remove()`等方法方便地处理HTML内容。 3. **事件处理**:`on()`, `off()`, `click()`,...

    Javascript 链式调用实现代码(参考jquery)

    标题“Javascript 链式调用实现代码(参考jquery)”和描述“谓的链式调用无非是一个语法技巧而已,我就学Jquery写了一个粗浅的库”说明了本段代码的核心在于演示如何使用JavaScript实现类似jQuery库中的链式调用特性...

    jquery语法与选择器介绍 带有案例

    jQuery的核心是它的链式操作和简洁的语法。在jQuery中,通常以`$`函数开始,它可以用来选择DOM元素、执行操作或创建新元素。 ```javascript // 选择元素 $('selector').action(); // 创建元素 $('&lt;element&gt;')....

    jquery连缀语法如何实现

    要了解如何实现连缀语法,首先要对jQuery的核心思想有一个全面的认识。 在jQuery中,连缀语法是通过返回jQuery对象自身来实现的。这样做的好处是,可以在一个表达式中连续调用多个jQuery方法,每个方法的返回值都是...

    基于jQuery框架的页面前端特效的设计与实现.pdf

    * jQuery 使用链式语法,可以方便地操作 DOM 元素 * jQuery 支持 CSS1.3 选择器,可以轻松设置、删除、读取 CSS 属性 * jQuery 提供了多种选择器,例如:`$()`、`find()`、`parent()` 等 知识点三:jQuery 事件响应...

    Jquery基础语法

    **jQuery基础语法详解** jQuery,一个轻量级的JavaScript库,因其简洁的API和高效的DOM操作而备受开发者喜爱。它极大地简化了JavaScript的使用,使得网页动态化和交互变得更加容易。在本文中,我们将深入探讨jQuery...

    jquery插件实现软件后台管理界面

    jQuery通过选择器(如$("#elementId"))使得选取DOM元素变得简单,然后可以使用链式调用来执行一系列操作,如CSS更改、事件绑定或数据操作。这种简洁的语法极大地方便了开发者编写代码。 在这个后台管理界面中,...

    jquery语法和注意事项

    ### jQuery语法和注意事项 #### 一、页面元素的引用 在使用jQuery进行页面元素操作时,最基础也是最重要的就是能够准确地引用到页面中的元素。jQuery提供了多种方式来选取元素,包括通过`id`、`class`、`标签名`等...

    jQuery1.8.3-20121215.zip(jQuery语法包)

    - **链式操作**:jQuery对象返回的是自身,允许连续调用多个方法,如`$("p").css("color", "red").hide()`。 - **DOM操作**:包括添加、删除或修改HTML元素,如`append()`, `remove()`, `html()`, `text()`等。 -...

    JQuery 语法

    **jQuery 语法** jQuery 是一个广泛使用的 JavaScript 库,它简化了HTML文档遍历、事件处理、...同时,jQuery的源码也是一个学习JavaScript和面向对象编程的好材料,可以帮助开发者深入理解JavaScript库的设计与实现。

    JQuery实现插入行

    jQuery对象支持链式调用,这意味着你可以连续执行多个方法,如`$("#example").css("color", "red").fadeIn(500)`。 在"JQuery实现插入行"这个主题中,我们将主要关注如何动态地向HTML表格中添加新的行。以下是一个...

    突破canvas语法限制 让他支持链式语法

    本篇文章关注的是如何通过一些技巧让Canvas支持链式语法,类似于jQuery那样使得代码更易读、更紧凑。 链式语法是一种编程风格,允许开发者在一个对象的方法调用后直接调用另一个方法,而无需反复引用该对象。在...

    jquery.min.js 3.6.4版本

    jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的CSS选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF ...

    jquery包.zip

    jquery设计的宗旨是“write Less,Do More”(即倡导写更少的代码,做更多的事情),其核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有...

    jQuery语法

    **jQuery语法** jQuery 是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画制作和Ajax交互。...通过熟悉并掌握jQuery的基本语法,开发者可以更快、更有效地实现动态网页效果和交互。

    基于jQuery+SVG实现文字星星闪烁特效源码.zip

    - 使用jQuery,开发者可以使用链式调用,使得代码更简洁、易读。 - `$(document).ready()`是jQuery中的常用函数,确保在DOM加载完成后执行代码。 2. **SVG**: - SVG是一种可缩放的矢量图形格式,它可以无损地...

    jquery中文手册.chm

    jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF ...

Global site tag (gtag.js) - Google Analytics