JQuery面向对象编程快速入门(八)-插件开发

JQuery源码片段分析

(function(window){
	/**
	  *   jQuery是一个函数
	                              是一个对象
	                              是一个构造器函数
	  */
	var jQuery = function( selector, context ) {
		return new jQuery.fn.init( selector, context );
	},

	//fn就是jQuery对象上的一个属性,该属性指向了prototype
	//jQuery的 prototype中的方法是根据jQuery的选择器获取到的jQuery对象,然后jQuery对象调用这些方法的
	//利用jQuery的选择器得到的jQuery对象就相当于利用jQuery的构造器创建出来的对象
	jQuery.fn = jQuery.prototype = {
		each: function( callback, args ) {
			return jQuery.each( this, callback, args );
		},
		ready:function(){}
	};
	//window对象动态的添加了一个属性jQuery,把匿名函数中的jQuery对象赋值给了window的jQuery对象
	//$实际上是window的一个属性,也是jQuery对象
	window.jQuery = window.$ = jQuery;

	jQuery.fn = jQuery.prototype = $.prototype = $.fn = window.$.fn = window.jQuery.fn = window.jQuery.prototype

	//在jquery中,可以把一个方法加入到jQuery或者$本身上, 直接利用jQuery或者$调用,这样的方法称为全局方法,也称为全局插件
	//在jquery中,可以把一个方法加入到jQuery或者$的prototype或者fn上,可以利用jquery的选择器获取到的jquery对象调用这些方法,这样的方法也称为插件方法
})(window);

自定义创建一个JQuery方法

1.回顾Js对象的prototype属性

在JS的世界中的所有事物都是对象:字符串、数字、数组、日期,等等。对象是拥有属性和方法的数据。每个对象都存在Prototype属性,
该属性可以让我们向js对象添加属性和方法,而在JQuery的世界,通过分析源码可以知道,JQuery同样是存在prototype属性,并且以$.fn
的形式存在($.fn等价于$.prototype),有了该属性,我们就可以动态地给JQuery对象添加属性和方法了。
我们可以理解为$.fn.方法名或者$.prototype.方法名 就是用来创建对象方法和属性,需要使用对象去调用,
$.方法名 是用来创建全局/静态方法和属性,使用$直接调用(注意:$ = JQuery = Window.JQuery = Window.$)

2.$.fn.myeach 和$.myeach的区别

/**
 * 匿名函数,外部不能直接访问
 *
 */
(function($){
	/**
	 * $.fn等价于$.prototype,$.fn.myeach如果利用JAVA面向对象的思想去理解,可以理解为在JQuery的世界,创建
	 * 了一个非静态的成员方法myeach,也就是JAVA中的对象的成员方法,这个成员方法是属于对象的 ,需要获取JQuery对象去调用,$().myeach()
	 */
	$.fn.myeach = function(){}
	/**
	 * $.myeach相当于创建了一个静态的方法,该方法是属于类的,也就是全局方法,可以直接使用$.myeach()去调用,不能使用JQuery对象去调用
	 */
	$.myeach = function(){}

})($);

综上所述,可以理解为$.fn.方法名 是创建对象的成员方法的,需要用对象去调用,$.方法名,去创建静态方法的也就是全局方法,不能使用对象去调用,直接使用$或者JQuery符号去调用

3.自定义一个$.myeach(obj,callback)方法和$().myeach(callback)方法

<!DOCTYPE html>
<html>
  <head>
    <title>jquery-plugin-myeach.html</title>

    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
	<script src="../js/jquery-1.4.2.js"></script>
	<script src="jquery-plugin-myeach.js"></script>
  </head>

  <body>
    This is my HTML page. <br>
		<div>asfd</div>
		<div>asfd</div>
		<div>adsf</div>
  </body>
</html>
/**
 * 匿名函数
 * @param $ JQuery对象,等同于JQuery
 */
(function($){
	/**
	 * 把myeach加入到jQuery或者$的prototype或者fn上,以后可以使用JQuery选择器获取的JQuery对象进行调用,如$()
	 * @param {Object} callback 回调函数
	 */
	$.fn.myeach = function(callback){
		var array = $(this);
		for(var i=0;i<array.length;i++){
			//this代表当前正在遍历的对象
			callback.call($(array[i]),$(array[i]));
		}
	}
	/**
	 * 直接给JQuery添加方法,以后不需要通过JQuery对象去进行调用,可以直接使用JQuery或$符号调用
	 * @param {Object} obj  可以来自于利用jquery的选择器创建的jquery对象,也可以来自于一个数组(来源于后台)
	 * @param {Object} callback 回调函数
	 */
	$.myeach = function(obj,callback){
		var array = obj;
		for(var i=0;i<array.length;i++){
			//this代表当前正在遍历的对象
			callback.call($(array[i]),$(array[i]));
		}
	}
})($);

$().ready(function(){
	//利用JQuery选择器获取JQuery对象调用myeach函数
	$("div").myeach(function(){
		//this代表当前正在遍历的div对象
		alert($(this).text());//把每个DIV标签中的文本打印出来
	});
	//使用JQuery符号$调用全局myeach函数,注意$=window.$=JQuery,其实就是window中的属性
	$.myeach($("div"),function(e){
		alert($(e).text());//把每个DIV标签中的文本打印出来
	});
});

2.自定义一个扩展插件方法extend(),并创建$.each()和$().each()方法

/**
 * 匿名函数
 */
(function($){

	/**
	 * 把插件直接添加到JQuery和$上,可以直接利用JQuery和$去调用,而不需要创建对象,这种称为全局方法或全局插件
	 */
	$.myextend=function(json){
		for(var i in json){
			$[i] = json[i];//把每个json对象直接加入到JQuery,相当于添加了全局的方法,这样可以不需要使用对象去调用
		}
	}

	/**
	 * 在JQuery中,可以把一个方法加入到jQuery或者$的prototype或者fn上,可以利用jquery的选择器获取到的jquery对象调用这些方法,这样的方法也称为插件方法,需要创建对象去调用
	 */

	$.fn.myextend=function(json){
		for(var i in json){
			$.fn[i] = json[i];//把每个json对象加入到JQuery对象的fn也就是prototype属性,这样可以使用对象去调用
		}
	}
})($);

$().ready(function(){
	/**
	 * 使用JQuery对象去调用$.fn中定义的方法
	 */
	$().myextend({
		_each:function(callback){
			var array = $(this);
			for(var i=0;i<array.length;i++){
				callback.call($(array[i]),$(array[i]));
			}
		}
	});
	/**
	 * 使用$符号去定义全局方法
	 */
	$.myextend({
		_each:function(obj,callback){
			var array = obj;
			for(var i=0;i<array.length;i++){
				callback.call($(array[i]),$(array[i]));
			}
		}
	});

	$("div")._each(function(){

		alert($(this).text());//把每个DIV标签的内容显示 

	});

	$._each($("div"),function(e){
		alert($(e).text());//把每个DIV标签的内容显示
	});

});

调用过程如下

时间: 2024-08-28 06:58:03

JQuery面向对象编程快速入门(八)-插件开发的相关文章

PHP面向对象编程快速入门

面向对象编程(OOP)是我们编程的一项基本技能,PHP4对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就通过实例来说明使用PHP的OOP进行编程的实际意义和应用方法.  我们通常在做一个有数据库后台的网站的时候,都会考虑到程序需要适用于不同的应用环境.和其他编程语言有 所不同的是,在PHP中,操作数据库的是一系列的具体功能函数(如果你不使用ODBC接口的话).这样做虽然效率很高,但是封装却不够.如果有一

bash编程快速入门

首先,我们简单的介绍一下bash,bash是GNU计划编写的Unixshell,它是许多Linux平台上的内定shell,它提供了用户与系统的很好的交互,对于系统运维人员,bash的地位是举足轻重的,bash编程能很快处理日常的任务 bash入门,一个最简单的bash例子 #vim hello.sh #!/bin/bash #This is the first example of the bash #echo "Hello world" 下面,我们就这个简单的bash 脚本来介绍一下

Haskell 函数式编程快速入门【草】

什么是函数式编程 用常规编程语言中的函数指针.委托和Lambda表达式等概念来帮助理解(其实函数式编程就是Lambda演算延伸而来的编程范式). 函数式编程中函数可以被非常容易的定义和传递. Haskell 快速入门 概述 Haskell是一个按照纯函数式编程思想创造的语言,支持静态类型.类型推断.惰性处理(推迟计算).支持并发编程. 安装 从官方网站的下载页面 https://www.haskell.org/downloads 根据自己的操作系统选择. 第一次接触Haskell

bash shell编程快速入门教程

Shell 俗称壳(用来区别于核),是指"提供使用者使用界面"的命令解析器(软件).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. 同时,Shell又是一种程序设计语言.作为命令语言,它交互式解释和执行用户输入的命令,或者自动地解释和执行预先设定好的一连串的命令.Shell不像C/C++等语言,它不需要编译就能执行.作为程序设计语言,Shell 定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. UNIX系

socket 网络编程快速入门(一)教你编写基于UDP/TCP的服务(客户端)通信

因为UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程. socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,因为这些函数的结构往往比较复杂,参数大部分都是结构体,令人难以记忆和理解. 但是一旦我们知道这些函数包括其参数的具体含义,socket网络编程也就变得不是那么复杂.这里不赘述 具体函数的详细含义,网络上有很多的文章,同时笔者建议大家参考 MSDN,对返回值,参数等会有更好的理解. 以下均为单线程的简单实例,多线程的请关注下一篇文章. (

一天掌握Android JNI本地编程 快速入门

一.JNI(Java Native Interface)  1.什么是JNI:               JNI(Java Native Interface):java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++) 外部的c/c++代码也可以调用java代码  2.为什么使用JNI: 效率上 C/C++是本地语言,比java更高效 代码移植,如果之前用C语言开发过模块,可以复用已经存在的c代码 java反编译比C语言容易,一般加密算法都是用C语言编写

Maya API编程快速入门

一.Maya API编程简介 Autodesk? Maya? is an open product. This means that anyone outside of Autodesk can change Maya's existing features or add entirely new features. There are several ways you can modify Maya: · MEL?-(Maya Embedded Language) is a powerful

Linux Bash Shell编程快速入门

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash# This is a very simple

Delphi xe7并行编程快速入门(转)

http://blog.csdn.net/henreash/article/details/41315183 现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库. 并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有