jq源码学习3_extend : JQ的继承方法

基于jquery-2.0.3的源码分析

//3.extend : JQ的继承方法
jQuery.fn.init.prototype = jQuery.fn;// 通过“init.prototype = jQuery.fn;”用jQuery()原型对象覆盖了jQuery.fn.init()的原型对象。
/*jQuery.extend = jQuery.fn.extend = function(){
	定义一些变量
	if(){}   看是不是深拷贝情况
	if(){}   看参数正确不
	if(){}   看是不是插件情况
	for(){   可能有多个对象情况
		if(){}  防止循环引用
		if(){}   深拷贝
		else if(){}   浅拷贝
	}
};*/
jQuery.extend = jQuery.fn.extend =function(){
  var options,//options,指向某个源对象
  name,//name,表示某个源对象的某个属性名
  src,//src,表示目标对象的某个属性的原始值
  copy,//copy表示某个源对象的某个属性的值
  copyIsArray,//copyIsArray,指示变量copy是否是数组
  clone,//clone,表示深度复制时原始值的修正值
  target = arguments[0] || {},// target,指向目标对象
  i = 1,//i,表示源对象的起始下标
  length = arguments.length,//length,表示参数个数,用于修正变量target
  deep = false;//是否是深拷贝默认是false
  if(typeof target ==="boolean"){ //看是不是深拷贝情况
     deep = target;
     target = arguments[1] || {};
     i = 2;
  }
  if(typeof target !== "Object" && !jQuery.isFunction(target)){ //看参数是否正确
    // 如果目标对象target不是对象、不是函数,而是一个字符串或其他的基本类型,则统一换成为空对象{},
    //为在基本类型上设置非原生属性是无效的。
    target = {};
  }
  if(length ===i){ //看是不是插件情况,插件只有一个对象
    // 变量i表示源对象开始的下标,变量length表示参数个数,如果两者相等,
    //表示期望的源对象没有传入,则把jQuery或jQuery.fn作为目标对象,
    //并把源对象的开始下标减一,从而使得传入的对象被当做源对象。变量length和i相等有两种情况:
   target = this;
    --i;
  }
  for(;i<length;i++){//可能有多个对象情况
     // arguments是一个类似数组的对象,包含了传入的参数,
     //可以通过整数下标访问指定位置的参数。
     //这行代码把获取源对象和对源对象的判断合并为一条语句,只有源对象不是null、undefined时才会继续执行。
    if((options = arguments[i]) != null){
      //开始遍历单个源对象属性
       for(name in options){
         //变量src是原始值,变量copy是复制值。如果复制值copy与目标对象target相等,
         //为了避免深度遍历时死循环,因此不会覆盖目标对象的同名属性。
         src = target[name];
         copy = options[name];
         // 注意,判断target === copy时使用的是“===”,强制不做类型转换;如果使用“==”,则可能因自动类型转换而导致错误。
         if(target === copy){ //防止循环引用
           continue;
         }
        // 如果是深度合并且复制值copy是个JavaScript普通的对象或数组,则递归合并
         if(deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray==jQuery.isArray(copy)))){ //深拷贝
         //复制值copy是数组时,如果原始值src不是数组,则修正为空数组;
        //复制值copy是普通JavaScript对象时,如果原始值src不是普通JavaScript对象,则修正为空对象{}。
        //原始值src或修正后的值赋值给值副本clone。
        if(copyIsArray){ //如果复制值copy是数组时
          copyIsArray = false;
          //clone,表示深度复制时原始值的修正值
          clone = src && jQuery.isArray(src) ? src : [];//复制值copy是数组时,如果原始值src不是数组,则修正为空数组;
        }else{
          //复制值copy是普通JavaScript对象时,如果原始值src不是普通JavaScript对象,则修正为空对象{}。
          // 通过调用方法jQuery.isPlainObject(copy)判断复制值copy是否是“纯粹”的JavaScript对象,
          //只有通过对象直接流量{}或new Object()创建的对象,才会返回true。
          clone = src && jQuery.isPlainObject(src) ? src : {};
        }
         // 先把复制值copy递归合并到原始值副本clone中,然后覆盖目标对象的同名属性。
        target[name] = jquery.extend(deep,clone,copy);
      }else if(copy !==undefined){// 如果不是深度合并,并且复制值copy不是undefined,则直接覆盖目标对象的同名属性。
        target[name] = copy;
      }

       }
    }
  }
  return target;
}
//3.extend : JQ的继承方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值