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. 通过ID获取元素 注:获取的元素是一个对象,如想对元素进行操作,我们要通过它的属性或方法。

    通过ID获取元素 学过HTML/CSS样式,都知道,网页由标签将信息组织起来,而标签的id属性值是唯一的,就像是每人有一个身份证号一样,只要通过身份证号就可以找到相对应的人.那么在网页中,我们通过id ...

  2. pure-Python PDF library

    # -*- coding: utf-8 -*- # # vim: sw=4:expandtab:foldmethod=marker # # Copyright (c) 2006, Mathieu Fe ...

  3. Python xlwt模块

    Examples Generating Excel Documents Using Python’s xlwt Here are some simple examples using Python’s ...

  4. 关于underline

    1, 有些系统可能看不到下划线的效果,这是不妨按着Alt键看看: 2, underline=#, 数字表示在哪个字母下显示下划线,从0开始

  5. HTML - 框架标签相关

    <html> <head></head> <!-- frameset 框架标签 cols : 按照列进行区域的切分 rows : 按照行进行区域的切分 fra ...

  6. mybatis结果封装到hashmap中没有null的数据

    1.在ssm框架中 在mybatis-config.xml配置文件中加下面这句代码即可解决 <setting name="callSettersOnNulls" value= ...

  7. Python3.6爬虫+Djiago2.0+Mysql --数据爬取

    1.下载对应版本的python mysql 模块 我的是:pymssql-2.2.0.dev0-cp36-cp36m-win_amd64.whl 2.手动创建table create table gr ...

  8. php完整表单实例

    PHP - 在表单中确保输入值 在用户点击提交按钮后,为确保字段值是否输入正确,我们在HTML的input元素中插添加PHP脚本, 各字段名为: name, email, 和 website. 在评论 ...

  9. SPSS应用之非参数检验

    SPSS应用之非参数检验 统计学的假设检验可以分为参数检验和非参数检验,参数检验是根据一些假设条件推算而来,当这些假设条件无法满足的时候,参数检验的效能会大打折扣,甚至出现错误的结果,而非参数检验通常 ...

  10. jeecms vue-cli项目结构详解

    Vue-cli是vue官方出品的快速构建单页应用的脚手架,如果你是初次尝试Vue,不建议使用,推荐你使用普通引入javascript文件的方式进行学习,如果你已经有vue基础那么就可以用vue-cli ...