jquery 插件开发及extend

    以下信息是在看了IBM上的一篇文章(使用 jQuery(中级),第 2 部分: 创建自己的插件)http://www.ibm.com/developerworks/cn/web/wa-aj-jquery6/?ca=drs-tp4608之后,自己的一些想法。

    这文章主要是从如何写一个插件上来说,中间主要用到的还是在jQuery.fn上做文章,通过定义一个闭包函数,将jQuery作为参数传递过去,再在这个fn增加自己的函数来实现。中间有几个问题,记录如下:

    1,为什么往fn上加函数就可以让jquery对象调用了呢?

看了下代码,注意到这句(jQuery.fn = jQuery.prototype),这句其实很明白了,jQuery.fn实际上就是jQuery.prototype,通过原型来实现一个函数的添加。而在fn上追加的函数上使用this,这个this实际上就是jQuery对象。因为fn就是prototype,调用函数者就是jQuery实现上就是jQuery的一个实例化对象。

 

    看了下文章中关于插件开发的,具体代码倒是其次,主要是其中有几个要点很重要。复制如下:

    1,让内部方法私有化,这其实就是说在自己写的插件里面,因为这个函数可能就自己的插件调用,这其实也是为了避免代码污染。在jquery中有很多例子的。

    2,让默认值可覆盖,这就是说在程序中可能会有一些默认值。所以需要在传递参数中,传递一些可以覆盖默认参数的东西,比如参数中经常传递options这个参数,其实就是拿来覆盖默认参数的。

 

    还有几个插件开发规则,复制如下:

    1,文件命名为 “jquery.<your plug-in name>.js”,这个没什么说的。

    2,所有新方法都附加到 jQuery.fn 对象,所有新功能都附加到 jQuery 对象,这个其实就是往对象上加函数。插件写法就是jQuery.fn.plugin=function(options)的这种样子。

    3,“this” 用于引用 jQuery 对象。这个如果按照第条规则,this肯定引用到jQuery的。

    4,插件中定义的所有方法/函数的末尾都必须带有一个 “;”(分号),否则将不利于代码的最小化。这个不清楚了。

    5,除有特别注明外,所有方法都必须返回 jQuery 对象,其实就是返回this。这个主要是为了链式编程吧,jQuery中到处都是这种。

    6,总是在插件代码中使用 “jQuery” 而不是 “$”。这个不是强制的,比如中我写的闭包就可以这样写:(function($))(jQuery)的这种格式,然后在里面使用$,这里的$其实就是jQuery,这个是参数传递上的东西。

 

   最后就是里面经常用到的extend函数了。简单看了下,整个函数很简单,就是一个复制过程,但在jQuery中经常用到,比如ajax就是通过extend带到jquery中的。

    这里面有个问题,我们使用ajax都是通过$.ajax这种形式访问的,这就表明ajax其实不算是jquery对象的一个方法,最多算一个静态方法。这就实际上说明,extend是往一个对象上追加信息,而$.ajax是往$这个类对象上加,而不是jqury实例对象站加,所以就不能用类似$().ajax的形式来进行ajax访问了,后者返回的是一个undefined信息。在方法内部,实际上就是一个this引用的问题了。

    还是将jquery自己的代码贴出来,在上面加注释信息。

 

jQuery.extend = jQuery.fn.extend = function() {
	//target就是复制目的是哪个对象,这里首先就是第一个参数。
	//i表示source的起始坐标。0被target占用,所以源是目的的下一个
	//length,当前参数长度了;deep,是否深度copy,深度copy就是将里面的对象再次序列化,进行迭代调用
	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;

	//处理第一个函数是boolean的情况,就是说第一个函数可以控制是否深度copy,那这样的话接下来的参数就是往后移位了.
	//jquery中很多地方都是这种处理情况,往往参数列表中有个参数缺失,那么不需要用null来占位,而是直接将后面的参数移到前面来,这样就有一个处理参数移位的问题.
	//在这个里面,第一个参数被占位,那么target就为1位了,源再+1往后走了.
	if ( typeof target === "boolean" ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	//处理这个目的不是object对象,且又不是函数的,这样的话,实际target可能就是其他东西,比如字符串或者基本类型等,这时就将target进行改变.实际上就是忽略target的原来信息.可以理解成一个用source来代替target.
	if ( typeof target !== "object" && !jQuery.isFunction(target) )
		target = {};

	//如果length==i,其实就是没有source的情况,那么将将target变成source,原先的target就直接用调用者this代替了.这样的话,其实就是直接往调用者上加东西.
	//这个用$.ajax来理解,最适合了.源代码中jQuery.extend({ajax:function()});的形式,其实就是直接往$上加函数,因为调用者就是jQuery
	if ( length == i ) {
		target = this;
		--i;
	}
	//进行循环,将source(可能有很多个source,按顺序进行copy),也就是说可以这样写$.extend(target,source1,source2);
	//这样后面的信息可以覆盖前面的信息,而source1可以是函数内置的一个默认信息,source2可以对信息进行更改.
	for ( ; i < length; i++ )
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null )
			// Extend the base object
			for ( var name in options ) {
				//这里就对两边进行取信息了,src表示从target中取的信息(这个可能是null,当然也可能不是,不是的话,那么后面的copy就可能要覆盖这个值了)
				//copy就是从source中取的信息了.
				var src = target[ name ], copy = options[ name ];

				// Prevent never-ending loop
				//这里主要是为了防止在深度copy的情况下,出现无限迭代的情况.比如这种情况:extend(true,target,{"a":target}),这样的话,就会出现无限copy了
				if ( target === copy )
					continue;

				// //这里就是处理深度copy了,如果需要,就进行深度copy,将copy后的值加到target中
				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
					target[ name ] = jQuery.extend( deep, 
						// Never move original objects, clone them
						src || ( copy.length != null ? [ ] : { } )
					, copy );

				// 不加undefined值
				else if ( copy !== undefined )
					target[ name ] = copy;

			}

	// 返回target
	return target;
};

     翻译都是按照自己的理解来翻译的,可能不对。

    

     在看了这个东西,感觉在其他程序中(我做java,java中很多这种)也有很多类似的设定,需要进行类似迭代处理,比较直观的就是java中java对象转json的处理了,都一样要对一个对象json化成一个string,中间仍要处理各种类型的信息,还要避免无限迭代等。

 

     以上都是整个jquery中大信息中的小小的一部分。了解一些,总比过后忘了好。

单细胞分析R包monocle3服务器安装教程 由于centos7系统yum只能安装到低版本gdal,而monocle3依赖包需要 gdal>2 版本,从gdal官网下载2.4.4版本编译安装。monocle3的安装是通过cole-trapnell-lab安装的,该包挂在github上,需要通过github先安装leidenbase包,需要提前安装devtools包下载工具。接着利用BiocManager安装相应的依赖包,由于这些包的特殊性,所以不要切换到国内Bio_Mirror镜像,否则会找不到,如果一次不成功,缺啥补啥即可。运行 ldconfig。 阅读详情

相关推荐

Keil v5.11给STM32烧录程序记录

1)安装KeilMDK511 2)安装ST Link下载器驱动 3)打开Keil v5,加载工程文件 4)load pack(Keil.STM32F1xx_DFP.1.1.0和Keil.STM32F0xx_DFP.1.2.0) 5)编译程序- 0 Error(s), 0 Warning(s). 6)烧录程序 ...

守望的距离 6281

jquery开发插件的方法$.extend 与 $.fn.extend

jquery开发插件的方法$.extend 与 $.fn.extend 1.$.extend $.extend(object);为扩展jQuery类本身.为类添加新的方法。 //使用方法 $.extend({ add:function(a,b){ return a+b; } }) //JQuery类本身的方法,可以通过$直接调用 console.log($.add(1,3)) /...

淡定如斯的博客 571

codemirror6 制作markdown编辑器(源码模式)

总体上感觉能用,但是不怎么友好,官方文档有点散乱,而且关键字高亮功能是独立出去的,去官方文档找半天,也没找到怎么改。EditorView.theme可以往EditorView模块中修改CSS的样式,从而影响编辑器的样式展示。"### 测试\n\n```javascript\nlet x = 'y'\n```"这个插件中的markdown语法的高亮样式。//这里指定markdown中代码块使用的解析扩展。开头的class样式,并且还需要在选择器前面添加。//markdown语言解析扩展。

qq_43203949的博客 1784

jQuery插件开发中的extend方法

Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,      dest是要整合的空间可以使{} 或者不写     src是一个JSON表达式表示的javascript对象.... 因此里面可以添加方法属性等等...  我么通过不同的应用可以将我们自己的方法整合到jQuery空间中....实现插件开发  在jQuery中定义  jQuery.ext

Programmer小卫 1213

LVGL仪表盘实战:5分钟用lv_meter打造汽车仪表UI(附完整代码)

本文详细介绍了如何使用LVGL的lv_meter组件在5分钟内构建专业汽车仪表盘UI。从环境配置、刻度定制到指针动画和性能优化,提供完整代码示例和实战技巧,帮助开发者快速实现嵌入式设备上的高效仪表盘设计。

k5l6m的博客 424

Windows11安装UE4+Airsim

Windows11安装UE4+Airsim

Legendyyy的博客 3743

jquery插件开发之jquery的$.extend()、$.fn和$.fn.extend() 相关解读

原文链接:http://caibaojian.com/jquery-extend-and-jquery-fn-extend.html jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend();· jQuery.fn jQuery.fn = jQuery.prototype = {    init: function( sel...

shadow_zed的博客 278

从412到200:一步步拆解瑞数6代jsvmp的cookie生成与验证流程

本文深入解析瑞数6代JSVMP的动态安全防护机制,详细拆解从412到200状态的cookie生成与验证流程。通过剖析JSVMP虚拟机核心机制、动态元数据解析及环境检测绕过策略,为逆向工程师提供实用的技术解决方案,帮助突破瑞数6代的高级防御体系。

weixin_30342209的博客 508

jQuery插件开发及jQuery.extend函数详解和jQuery.fn与jQuery.prototype区别

一、jQuery插件开发分为两种:  1.类级别: 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法。  开发扩展其方法时使用$.extend方法,即jQuery.extend(object);  $.extend({      add:function(a,b){return a+b;} ,      minus:function(a

2181

FISCO BCOS 系列(一)—— 搭建第一个区块链网络&配置控制台指南

本文详细介绍了FISCO BCOS区块链网络的搭建与配置过程,包括环境准备、单机四节点网络搭建、控制台配置使用等核心内容。从系统要求、依赖安装开始,逐步指导如何通过脚本快速搭建区块链网络,配置控制台连接,并演示了账户管理、合约部署调用等基础操作。同时提供了多节点网络配置、常见问题解决方案以及生产环境安全建议,为开发者提供了从入门到进阶的完整指南。

分享AI、区块链技术及应用,未来已来 812

如何免费快速的部署一个自用免VIP的自动追剧工具!NAS新玩法!豆瓣与迅雷结合,轻松实现自动下载电影自动追剧功能(支持Windows,群晖nas,飞牛nas,软路由,服务器等Docker快速部署)

追剧党狂喜!豆瓣追剧神器,自动添加云盘,自动下载,微信通知,一键搞定!

XiaoqiangClub的博客 4584

$.fn.extend的讲解, jQuery插件开发的两种方法

jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法。 开发扩展其方法时使用$.extend方法,即jQuery.extend(object);  $.extend({         add:function(a,b){return a+b;} ,

LYBWWP 1948

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jQuery插件开发的两种方法及$.fn.extend的详解

jQuery插件开发的两种方法及$.fn.extend的详解   jQuery插件开发的两种方法及$.fn.extend的详解. Query插件开发分为两种:    1 类级别    类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法。    开发扩展其方法时使用$.extend方法,即jQuery.extend(object);  复制...

狼丶宇先森的网络科技空间 402

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jquery开发插件方法之$.extend()、$.fn、$.fn.extend()、$.widget()

jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); 关于jQuery.fn jQuery.fn = jQuery.prototype = {    init: function( selector, context ) {    //…    } }; 原来,jQuery.fn = jQuery.prototype,对proto...

一只白猫罢了 430

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【jquery】jquery中开发插件的两个方法jquery.fn.extend与jquery.extend(推荐)

jQuery为开发插件提拱了两个方法,分别是:  JavaScript代码  .代码如下: jQuery.fn.extend(object);  jQuery.extend(object);  jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。  jQuery.fn.extend(object);给jQuery对象添加

PHP在线开发笔记 862

jquery 插件开发/插件编写$.fn.extend(),$.extend()

js/jquery 插件开发,进一步提高插件编写能力!

京都玩家 1926

详解jQuery插件开发中的extend方法

Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型, dest是要整合的空间可以使{} 或者不写 src是一个JSON表达式表示的javascript对象.... 因此里面可以添加方法属性等等... 我么通过不同的应用可以将我们自己的方法整合到jQuery空间中....实现插件开发 在jQuery中定义  jQuery.extend = j

691

jQuery插件开发中$.extend和$.fn.extend辨析

jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法。 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $.extend({ add:function(a,b){return a+b;}, ...

weixin_34061555的博客 88
上一篇: Log4j启动过程
下一篇: Hibernate关联中对于mappedby 继承属性的描述和解决方法
Fly_m
博客等级 码龄20年 40粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值