a、jQuery.extend( source )
b、jQuery.extend(destination, source1, source2, source3 ....)

c、jQuery.extend(boolean, destination, source1, source2, source3 ....)

  以上是jquery的extend实现方法

首先是第一种:传入一个源函数,拓展自己

 var Test = function(){};
Test.prototype.extend = function(source){
for(var key in source){
this[key] = source[key]
}
return this;
}
var Myobj = {
name:'qiaoming'
}
var test = new Test();
console.log(test.extend(Myobj))

然后是第二种:传入一个源函数,拓展目标对象

    function extend(d,s){
for(var key in s){
d[key] = s[key]
}
}

首先写一个拓展对象的方法

Test.prototype.extend = function(){
var source , destination
if(arguments.length === ){
destination = this;
source = arguments[];
extend(destination,source)
return destination;
}
if(arguments.length > ){
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len); for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s)
}
return destination;
}
function extend(d,s){
for(var key in s){
d[key] = s[key]
}
}
}

根据参数数量,选择拓展方法

第三种根据第一个参数是否为布尔值,判断是否进行深拷贝

根据第一个参数是否为布尔值进行判断

    function extend(d,s,b){
var d = d;
if(b && b===true){
for(var key in s){
var v = s[key];
// 假如v还是object
if(v instanceof Array){
d[key] = extend(d[key] || [] , v , true);
}else if(v instanceof Object){
d[key] = extend(d[key] || {} , v , true);
}else{
d[key] = v;
}
}
}else{
for(var key in s){
var v = s[key];
d[key] = v;
}
}
return d
}

重构extend,拥有第三个参数如果为true就深拷贝

最后的代码如下

Test.prototype.extend = function(){
var source , destination
if(arguments.length === ){
destination = this;
source = arguments[];
extend(destination,source)
}
if(arguments.length > ){
var len,destination,source;
if( arguments[] === true ){
len= arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s,true)
}
}else{
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s)
}
}
return destination;
}
function extend(d,s,b){
var d = d;
if(b && b===true){
for(var key in s){
var v = s[key];
// 假如v还是object
if(v instanceof Array){
d[key] = extend(d[key] || [] , v , true);
}else if(v instanceof Object){
d[key] = extend(d[key] || {} , v , true);
}else{
d[key] = v;
}
}
}else{
for(var key in s){
var v = s[key];
d[key] = v;
}
}
return d
}
}

这样我们就可以实现一个对象的深浅拷贝

jquery源码学习(四)—— jquery.extend()的更多相关文章

  1. jQuery 源码学习 - 02 - jQuery.fn.extend 与 jQuery.extend

    参考资料:[深入浅出jQuery]源码浅析--整体架构,备用地址:chokcoco/jQuery-. extend 方法在 jQuery 中是一个很重要的方法.jQuery 内部用它来拓展静态方法或者 ...

  2. jquery源码学习笔记三:jQuery工厂剖析

    jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...

  3. jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量

    jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...

  4. jQuery源码学习扒一扒jQuery对象初使化

    神奇的jQuery可以这样玩jQuery("#id").css()或 jQuery("#id").html() 这么玩jQuery("#id" ...

  5. jquery 源码学习(四)构造jQuery对象-工具函数

    jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下.   作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原 ...

  6. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  7. 读艾伦的jQuery的无new构建,疑惑分析——jquery源码学习一

    背景: 有心学习jquery源码,苦于自己水平有限,若自己研究,耗时耗力,且读懂之日无期. 所以,网上寻找高手的源码分析.再经过自己思考,整理,验证.以求有所收获. 此篇为读高手艾伦<jQuer ...

  8. jquery 源码学习(一)

    从上边的注释看,jQuery的源码结构相当清晰.条理,不像代码那般晦涩和让人纠结   1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQ ...

  9. jquery 源码学习(*)

    最近在做日志统计程序,发现对方的程序是在Jquery基础上进行开发的,而公司的网站的框架是prototype.而且我也早就想了解一下Jquery源码,故决定研究Jquery源码,模拟它的方法   Jq ...

  10. 菜鸟的jQuery源码学习笔记(前言)

    前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...

随机推荐

  1. mysql commond record

    CREATE DATABASE IF NOT EXISTS codex_gm DEFAULT CHARACTER SET utf8; service mysqld stop screen -dmS m ...

  2. 【珍惜时间】iReport

    项目很点意思,感觉很高超的样子 先放下项目的github地址:https://github.com/tctangyanan/iReport 感谢各位伟大的程序员无私的分享自己的技术 老规矩,我们会运行 ...

  3. 【自家测试】2017-12-16 FJOI2016 d1

    1. 所有公共子序列问题(allcs.pas/c/cpp)★问题描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X= x 1 x 2 ... x m ,则另一序列Z ...

  4. vuex基础知识总结

    项目中要求添加vuex,根据学习我这个小白总结了一点自己的心得,供大家参考 在学习之前,要知道两件事 为什么要用vuex?vuex要什么场景下应用? 简单点解释一下 1.项目中应用了vue脚手架之后, ...

  5. iOS开发CoreData的多表关联

    1.多表关联 多表关联,对SQL 数据库的操作,在一张表的数据中可以引用另外一张表里的数据.通过 Entity 实体中的 Relationships 来实现,比起传统的 SQL 数据库来,更加简单. ...

  6. String类的endsWith()方法和startsWith()方法

    String 的endsWith() 方法用于测 试字符串是否以指定的后缀结束.如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true:否则返回 false.注意,如果参数是空字符串,或 ...

  7. python3-常用模块之random

    random 1.取随机小数 : 数学计算# print(random.random()) # 取0-1之间的小数# print(random.uniform(1,2)) # 取1-2之间的小数 2. ...

  8. 05-1-操作css样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. CAS(客户端)程序获取安全证书

    以下是获取安全证书的一种方法,通过以下程序获取安全证书: import java.io.BufferedReader; import java.io.File; import java.io.File ...

  10. C/C++ 信号量 CreateSemaphore 用法

    HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD LONG lInitialCount, // in ...