jQuery源码解析(架构与依赖模块)笔记二--核心模块

2.1对象的构建

面向对象的语言都有一个特点,他们都会有类的这一概念,通过类可以抽象出创建具体相同方法与属性的对象。

函数在充当构造器时,原型prototype是一个重要的概念。prototype是构造函数的一个属性,该属性指向一个对象。而这个对象将作为该构造函数所创建的所有实例的基引用,可以把对象基引用想象成一个自动创建的隐藏属性。当访问对象的一个属性时,首先查找对象本身,找到则返回;若不则查找基引用指向的对象的属性(如果还找不到实际上还会沿着原型链向上查找,直至到根)。只要没有被覆盖的话,对象原型的属性就能在所有的实例中找到。

类一:

<span style="font-size:10px;"><span style="font-size:10px;">function ajQquery(){
		this.name = 'jQuery';
		this.sayName = function(){
			return this.name;
		}
	}
	var a = new ajQquery();
	var b = new ajQquery();</span></span>
类二:

<span style="font-size:10px;">function ajQuery(){
		this.name = 'jQuery';
	}

	ajQquery.prototype = {
		sayName: function(){
			return this.name;
		}
	}
	var a = new jQuery();
	var b = new jQuery();</span>
类一要为每个每个实例都复制一个sayName方法,每个方法都占用了一定的内存空间,所以把属性方法写在声明的构造函数中,会浪费很多空间。类二则三个实例对象则共享了原型的sayName方法。
jQuery = function(selector, context){
		return new jQuery.fn.init(selector, context);
	}
	jQuery.fn = jQuery.prototype = {
		init: function(){
			return this
		},
		jquery: version,
		contructor: jQuery,
		.....
	}
	var a = $();
使用原型结构,性能上得到了优化。

2.2分离构造器

通过new操作符构建一个对象,一般经过四个步骤:

A.创建一个新对象

B.将构造函数的作用域链给新对象(所以this就指向了这个新对象)

C.执行构造函数中的代码

D.返回这个新对象

如果我们需要原型链就必须要new操作符来进行处理,主要是把原型链跟实例的this关联起来,否则this对象就变成window对象了。

var $$ = ajQuery = 
	function(selector){
		this.selector = selector;
		return this;
	}
	ajQuery.fn = ajQuery.prototype =
	{
		selectorName:function(){
			return this.selector;
		},
		construtor: ajQuery
	}
	var a = new $$('aaa');
	a.selectorName();//aaa
2.3静态与实例分享设计

画龙点睛之处:init.prototype = jQuery.fn,把jQuery.prototype原型的引用赋给jQuery.fn.init.prototype的原型,这样就把2个函数构造器的原型给关联起来了。

ajQuery.fn = ajQuery.prototype = 
	{
		name:'Leeon',
		init: function(selector)
		{
			this.selector = selector;
			return this;
		},
		constructor: jQuery;
	}
	ajQuery.fn.init.prototype = ajQuery.fn;
通过原型传递解决问题,把jQuery的原型传递给jQuery.prototype.init.prototype。换句话说jQuery的原型对象覆盖了init构造器的原型对象。

2.4方法链式调用的实现

jQuery的这种管道风格的链式代码,总的来说:

A.节约JS代码;

B.所返回的都是同一个对象,可以提高代码的效率。

我们看一段链式代码:

end() 方法结束当前链条中的最近的筛选操作,并将匹配元素集还原为之前的状态。

$('input[type="button"]').eq(0).click(function(){
		alert('点击我!');
	}).end().eq(1).click(function(){
		$('input[type="button"]:eq(0)').toggle('click');
	}).end().eq(2).toggle(function(){
		$('aa').hide('slow');
	},function(){
		$('aa').show('slow');
	});
  跨浏览器的链式调用实现:简单扩展原型方法,return this的形式。

aQuery.prototype = {

init:function(){

return this;//返回当前实例的this,又可以访问自己的原型(节省代码量,提高代码效率)

}

name:function(){

return this;

}

}

缺点:所有对象都没有返回值,返回对象本身。

2.5插件接口的设计

jQuery插件的开发分为两种:

1>挂在jQuery命名空间下的全局函数,也可以称为静态方法;

2>jQUery对象级别的方法,即挂在jQuery原型下的方法,这样通过过滤选择器获取的jQuery对象实例也能共享该方法。

提供的接口:

$.extend(target, [object1], [objectN])

接口的使用:

jQuery.extend({//指向jQuery的构造器

data:function(){},

removeData:function(){}

})

jQuery.fn.extend({//指向jQuery构造器的实例对象 fn与jQuery是两个不同的对象,jQuery.fn.extend调用的时候,this指向了fn对象,jQuery.fn和jQuery.prototype

data:function(){},//指向同一对象,扩展fn也就是扩展prototyoe原型对象。所以增加的原型方法也就是对象的方法了。

removeData:function(){}

})

注:js上下文调用方式有方法调用模式、构造器模式、函数调用模式、apply调用模式

2.6回溯处理设计

比如说有有一个ul,里面有很多li,当我们给il绑定一个事件很简单,即aaron.find("li").click(function(){});,如果又想给父元素添加点击事件,又需要在arrion上绑定一次,会很麻烦,所以引入了一种简单的寻址机制,可以回溯到之前的Dom元素集合,通过end()方法实现。

addback()调用它在栈中回溯的位置,然后把两个位置的元素组合起来并把这个新的组合起来的元素推入到栈的上方。

2.7end与addback

end方法是回溯到上一个DOM合集,因此对于链式操作与优化,这个方法还是很有意义的。

源码实现:

end:function(){
		return this.prevObject || this.constructor(null);
	}
2.8栈和队列的操作

jQuery是模仿的数组结构,肯定需要一套类数组的方法。提供了:get()、:index()、:it()、:gt()、:even()、:odd()等这类索引值相关的筛选器。

get方法:通过检索匹配jQuery对象得到对应的DOM元素。如下代码实现“

get:function(num){
		return num != null ?
		//Reuturn just the one element from the set
		(num < 0 ? this[num + this.length] : this[num]):
		//Return all the elements in a clean array
		slice.call(this);
	}
由于数组的关系,所以有快速方法:

first : function(){
		return this.eq(0);
	},
	last : function(){
		return this.eq(-1);
	},
2.9get与eq的区别

.eq():减少匹配元素的集合,根据index索引值,精确指定索引对象

.get()通过检索jQuery对象得到对应的DOM元素

区别:

1>eq返回的是一个jQuery对象,get返回的是一个DOM对象。

<span style="white-space:pre">	</span>$("li").get(0).css("color", "red");//错误,返回的是DOM节点
	$("li").eq(0).css("color", "red");//正确

	var li = $("li").get(0);
	$(li).css("color", "red");//正确,将dom对象转变为jQuery对象,但是分两步很麻烦,建议用eq()
eq()的实现原理:

eq(): function(i){
		var len = this.length,
				j = +i + (i < 0 ? len : 0);

		return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
	}
eq()只能产生一个新对象,因为是数组,所以需要一个集合,可以用.slice(strat[, end]);

var arr = [];

arr.push(this.slice(strat[, end]));

this.pushStack(arr);

2.10迭代器

$.each()是一个典型的迭代器。可以传入额外的function。

迭代的特点:

1>访问一个集合对象的内容无需暴露它的内部。

2>为遍历不同的集合结构提供统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

3>遍历的同时更改迭代器所在的集合结构可能会导致问题。

实现一个简单回调:

function each(obj, callback, context, arg){
		var i = 0;
		var value;
		var length = obj.length;

		for(; i < length; i++){
			callback.call(context || null, obj[i], arg);
		}
	}

	var arr = ['a', 'b', 'c'];
	each(arr, function(name, arg){
		console.log(name, arg, this);
	}, this, 'aaa');

当根据回调的处理,从而判断是否要立刻中止这个循环,从而节约性能,也是很简单的,通过获取处理返回值即可。

function each(obj, callback, context, arg){
		var i = 0;
		var value;
		var length = obj.length;

		for(; i < length; i++){
			callback.call(context || null, obj[i], arg);
			if(value == false){
				break;
			}
		}
	}
2.11jQuery的each迭代器

$.each()函数用于迭代任何集合

$(selector).each()用来专门遍历一个jQuery对象的





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
# 智慧旅游解决方案摘要 智慧旅游解决方案旨在通过新一代信息网络技术和装备,实现旅游服务、管理、营销和体验的智能化。该方案响应国家政策背景,如国家旅游局和工业信息化部的指导意见,以及国家发改委的发展规划,强调数字化、网络化、智能化在旅游业的应用,推动5G和移动互联网技术在旅游领域的创新应用。 方案的建设目标围绕“一个中心、四个方面、五大平台”展开,即以智慧旅游数据中心为核心,面向服务、管理、商务和营销构建智慧景区管理平台、智慧旅游服务平台、智慧旅游商务平台和智慧旅游营销平台。这五大平台将整合全域旅游资源,提升旅游设施,拓展旅游空间,融合旅游产业链,提升旅游服务,定制旅游产品,推进旅游改革。 建设内容涵盖了整体架构的构建,包括智慧服务、智慧管理、电子商务和智慧营销等方面。通过云计算、人工智能、大数据、物联网、5G等技术,实现“云-管-端”服务能力,打造集时间、空间、层次为一体的体验平台。此外,还包括智慧景区管理平台的多个子系统,如视频监控、应急指挥调度、流量监测、舆情监督、线路SOS一键呼救、GIS人车调度、停车场管理、语音广播、环境监测管理、多媒体发布、电子巡更以及指挥调度大屏建设等。 智慧旅游服务平台则包括自助票务系统、人脸识别、扫码购票、景区门户网站、机游、WIFI覆盖系统、数字全景VR、AI机器人、智慧座椅、智慧厕所等,旨在提升游客体验,实现景区的智能化管理和服务。通过这些服务,游客可以享受到便捷的购票、入园、导览和信息服务,同时景区管理者能够更有效地监控和管理景区运营。 智慧旅游商务平台则侧重于旅行社团队申报、电子商城、综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游企业提供全面的商务服务和营销支持。这些平台和系统帮助旅游企业拓宽分销渠道,实现财务管理和订单管理,同时为游客提供便捷的支付和会员服务。 最后,智慧营销平台通过综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游行业提供精准的营销工具和策略。这些工具和策略有助于整合旅游资源,拓宽销售渠道,提升游客体验,实现旅游业务的数字化和智能化。 智慧旅游解决方案通过这些综合性的技术和平台,不仅提升了游客的旅游体验,还为旅游行业的可持续发展提供了强有力的技术支持和数据驱动的决策依据。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值