`
yangtao309
  • 浏览: 66776 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

js学习的点小积累

阅读更多
对Jquery也有了个初步的了解
对其源码的学习是源于$.extend方法的运用上

先看Jquery.extend的方法
jQuery.extend = jQuery.fn.extend = function() {
	// copy reference to target object
	var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;

	// Handle a deep copy situation
	if ( target.constructor == Boolean ) {
		deep = target;
		target = arguments[1] || {};
	}

	// extend jQuery itself if only one argument is passed
	if ( al == 1 ) {
		target = this;
		a = 0;
	}

	var prop;

	for ( ; a < al; a++ )
		// Only deal with non-null/undefined values
		if ( (prop = arguments[a]) != null )
			// Extend the base object
			for ( var i in prop ) {
				// Prevent never-ending loop
				if ( target == prop[i] )
					continue;

				// Recurse if we're merging object values
				if ( deep && typeof prop[i] == 'object' && target[i] )
					jQuery.extend( target[i], prop[i] );

				// Don't bring in undefined values
				else if ( prop[i] != undefined )
					target[i] = prop[i];
			}

	// Return the modified object
	return target;
};



下面说说怎么样运用该方法

1.方式一, 最基本的方式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>$.extend() Example</title>
    <link rel="stylesheet" type="text/css" href="../common.css">
    <script type="text/javascript"
            src="../scripts/jquery-1.2.1.js"></script>
    <script type="text/javascript"
            src="../scripts/support.labs.js"></script>
    <script type="text/javascript">
      var target =  { a: 1, b: 2, c: 3 };
      var source1 = { c: 4, d: 5, e: 6 };

      $(function(){
        $('#targetBeforeDisplay').html($.toSource(target));
        $('#source1Display').html($.toSource(source1));
        $('#source2Display').html($.toSource(source2));
        $.extend(target,source1);

        $('#targetAfterDisplay').html($.toSource(target));
      });
    </script>
    <style>
      label { float: left; width: 108px; text-align: right; }
      p { clear: both; }
      label + span { margin-left: 6px; }
      fieldset { width: 360px }
    </style>
  </head>

  <body>
    <h1>$.extend() Example</h1>
    <fieldset>
      <legend>$.extend() Example</legend>
      <p>
        <label>target (before) =</label>
        <span id="targetBeforeDisplay"></span>
      </p>
      <p>
        <label>source1 =</label>
        <span id="source1Display"></span>
      </p>
      <p>
        <label>source2 =</label>
        <span id="source2Display"></span>
      </p>
      <p>
        <label>target (after) =</label>
        <span id="targetAfterDisplay"></span>
      </p>
    </fieldset>
  </body>
</html>

输出

引用

target (before) = {a:1,b:2,c:3}

source1 = {c:4,d:5,e:6}

source2 = {e:7,f:8,g:9}

target (after) = {a:1,b:2,c:4,d:5,e:6}


第二种方式
只改了核心执行部分
    <script type="text/javascript">
      var target =  { a: 1, b: 2, c: 3, location: { city: 'Boston'} };
      var source1 = { c: 4,  location: { state: 'MA'}, d: 5, e: 6 };
      var source2 = { e: 7, f: 8, g: 9 };

      $(function(){
        $('#targetBeforeDisplay').html($.toSource(target));
        $('#source1Display').html($.toSource(source1));
        $('#source2Display').html($.toSource(source2));
        //$.extend(target,source1);
        $.extend(true, target, source1);
        $('#targetAfterDisplay').html($.toSource(target));
      });
    </script>


输出
引用

target (before) = {a:1,b:2,c:3,location:{city:'Boston'}}

source1 = {c:4,location:{state:'MA'},d:5,e:6}

source2 = {e:7,f:8,g:9}

target (after) = {a:1,b:2,c:4,location:{city:'Boston',state:'MA'},d:5,e:6}



我们开始分析源代码
首先
引用

// copy reference to target object
var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;


设置target的值,如果一个参数有值,就为第一个参数值,否则设置一个空的对象
设置变量a,a1值,deep定义为false默认不是深度copy

引用

// Handle a deep copy situation
if ( target.constructor == Boolean ) {
         deep = target;
	target = arguments[1] || {};
}


处理深度copy情形,如果第一个参数值的构造子为Boolean对象,即设置deep值和改变target值为第二个参数

引用

// extend jQuery itself if only one argument is passed
if ( al == 1 ) {
	target = this;
	a = 0;
}


如果仅为一个参数的情形,target设置为自己,设置a=0;

引用

var prop;

for ( ; a < al; a++ )
	// Only deal with non-null/undefined values
	if ( (prop = arguments[a]) != null )
		// Extend the base object
		for ( var i in prop ) {
			// Prevent never-ending loop
			if ( target == prop[i] )
				continue;

			// Recurse if we're merging object values
			if ( deep && typeof prop[i] == 'object' && target[i] )
				jQuery.extend( target[i], prop[i] );

			// Don't bring in undefined values
			else if ( prop[i] != undefined )
				target[i] = prop[i];
		}




如果参数只有一个,那么从第一个参数开始,否则默认从第二个参数开始
先将参数的值付给prop对象
在迭代每个临时prop
对应参试为{a:1,b:3}形式的 for in 操作
i取值为key-value的key值

如果target的值(原始值)和参试中迭代的值有相等的时,继续执行循环跳出本次循环

// Recurse if we're merging object values
if ( deep && typeof prop[i] == 'object' && target[i] )
	jQuery.extend( target[i], prop[i] );

如果为深度copy 并且第I个对象的值为“object”类型 并且 target对象的第I个值为真
那么就继续深度COPY,让其prop[i]的值继续copy到target[i]中(这里只支持两层)

else if ( prop[i] != undefined )
         target[i] = prop[i];

继续看就是,非深度COPY的情形。赋值到即可

//-----------------------------------------------------------------
以上就是我的理解,其实看懂一段源码还真需要些时间, 虽然看懂之后觉得这是很简单的
但是认真读下来还是有收获的

分享到:
评论

相关推荐

    C# ASP.NET JS 学习工作代码积累

    标题"“C# ASP.NET JS 学习工作代码积累”"表明这是一个关于C#、ASP.NET和JavaScript编程技术的学习与工作经验的集合。C#是一种面向对象的编程语言,常用于构建Windows应用程序和Web应用,尤其是与.NET框架结合时。...

    javascript学习总结,包含平时积累的例子

    文件“javascript一些小例子”中可能包含了各种实际应用场景的代码片段,如动态DOM操作、事件处理、异步请求等。通过这些例子,你可以更好地理解JavaScript在实际项目中的运用,巩固和扩展你的知识。 总之,...

    「JavaScript学习资料整理」系列,构建JavaScript前端知识体系,积累JavaScript前端开发经验.zip

    这个名为“JavaScript学习资料整理”的系列资源,旨在帮助开发者构建完整的JavaScript前端知识体系,从而深入理解和积累JavaScript的开发经验。通过研究这个压缩包中的内容,我们可以系统地学习JavaScript的各种关键...

    Ext JS学习资料

    Ext JS 是一款基于 JavaScript 的前端框架,主要用于构建复杂的企业级 Web 应用程序。它提供了一套丰富的 UI 组件库以及一系列用于数据处理、应用架构设计等功能模块。自发布以来,Ext JS 不断迭代更新,版本4(Ext ...

    Web学习积累,学习笔记

    "Web学习积累"这一主题涵盖了广泛的知识点,包括但不限于HTML、CSS、JavaScript基础,前端框架,后端开发,数据库管理,服务器配置,以及Web安全等方面。这里我们将深入探讨这些重要概念。 首先,HTML(HyperText ...

    javascript学习小组研究成

    在这个“JavaScript学习小组研究成”项目中,小组成员们经过一个月的努力,积累了丰富的教程、案例和实际项目经验,旨在为其他学习者提供宝贵的资源。 首先,我们要了解JavaScript的基础知识。JavaScript是一种解释...

    javascript逆向 猿人学 js混淆 回溯 逆向学习

    JavaScript逆向是指通过分析和理解经过混淆的JavaScript代码,以及对代码执行过程的回溯和逆向学习,来揭示代码的...总之,JavaScript逆向学习是一项需要耐心和技术积累的工作,通过不断的实践和学习,可以提升对Jav

    js学习笔记

    这份“js学习笔记”包含了作者在学习JavaScript过程中积累的知识点和示例代码,对于初学者或者想要深入理解JavaScript的开发者来说,是一份宝贵的参考资料。 一、基础语法 JavaScript的基础语法包括变量声明(var、...

    javascript学习

    JavaScript学习是一个持续的过程,随着技术的发展,新的API和最佳实践不断涌现。因此,保持学习和关注最新的前端趋势至关重要。同时,实践是检验知识的最好方式,多做项目、参与开源社区,可以提升你的技能并积累...

    ASP.NET课件 源码 学习时积累的小代码

    这个压缩包文件“ASP.NET课件 源码 学习时积累的小代码”显然是一个学习资源,包含了在学习ASP.NET过程中积累的源代码示例。这些小代码片段可能涵盖了ASP.NET的核心概念和技术,有助于初学者理解并掌握ASP.NET的编程...

    javascript 学习利器

    另外,现代JavaScript学习还包括ES6及以上版本的新特性,如箭头函数、Promise、async/await等,它们使得代码更简洁、易读。 最后,了解前端框架如React、Vue或Angular,会大大扩展JavaScript的应用范围。这些框架...

    金典javascript学习实例

    "金典javascript学习实例"是一份宝贵的资源,旨在帮助开发者深入理解和掌握JavaScript这门重要的编程语言。JavaScript,简称为JS,是一种广泛应用于网页和网络应用的脚本语言,尤其在前端开发领域,它的重要性...

    js example积累

    "js example积累"这个标题表明我们即将探讨的是关于JavaScript的一些实用示例和经验积累,这对于初学者和有经验的开发者来说都是宝贵的资源。在这个压缩包文件中,可能包含了各种JavaScript的代码片段、实验项目或...

    JS小实例,对项目的开发很有用

    综上所述,"JS小实例"涵盖了JS开发中的诸多核心知识点,无论是初学者还是经验丰富的开发者,都能从中受益。每个实例都是一个实际问题的解决方案,通过学习这些实例,开发者不仅可以掌握JS的基本语法,还能积累实战...

    JavaScript学习总结

    本文档,是本人看了大量的JavaScript书籍和文档后,将自己所积累到的关于JavaScript方面的知识总结起来,而写成的一个关于JavaScript的学习总结文档

    基于js, javaScript的美食菜谱小程序

    本项目“基于js, javaScript的美食菜谱小程序”就是一个典型实例,它集成了菜谱的管理、查询、下单等一系列功能,非常适合作为学生毕业设计的实践项目,同时也为开发者提供了学习和二次开发的平台。 首先,我们要...

    学习课件JavaScript学习文件.zip

    在过去的一段时间里,我投入了大量的时间和精力进行学习,积累了丰富的个人学习资源。这些资源不仅包括各类书籍、课程和在线教程,还包括我在学习过程中的笔记、心得和反思。 首先,我发现阅读是一种非常有效的学习...

    学习知识积累

    在IT领域,不断的学习和知识积累是至关重要的。"学习知识积累"这个标题暗示了这是一个包含各种IT基础知识的资源集合,旨在帮助用户提升其技术理解并拓展知识面。描述中的"日常知识积累,笔记,IT,web,sH"表明这份...

    JS知识积累和新闻管理系统

    【标题】"JS知识积累和新闻管理系统"是一个综合性的项目,旨在帮助开发者深入理解和实践JavaScript(简称JS)技术,并提供一个新闻管理的平台。在这个系统中,你可以学习到JS的各种核心概念,同时通过实际操作来提升...

Global site tag (gtag.js) - Google Analytics