JQ的继承方法

使用方法:
// jQuery.extend 将一个方法扩展到函数下面,叫扩展静态方法
// jQuery.fn.extend 将一个方法扩展到原型对象下面,扩展实例方法
jQuery.extend = jQuery.fn.extend// 当只写一个对象自变量的时候,JQ中扩展插件的形式
$.extend({aaa: function(){alert(1);},bbb: function(){alert(2);}
});$.aaa();
$.bbb();// 扩展JQ实例方法
$.fn.extend({aaa: function(){alert(3);},bbb: function(){alert(4);}
});$().aaa();
$().bbb();// 这里的this相当于$
$.extend(); -> this -> $ -> this.aaa -> $.aaa()
// 这里的this相当于$.fn
$.fn.extend(); -> this -> $.fn -> this.aaa -> $().aaa()// 当写多个对象自变量的时候,后面的对象都是扩展到第一个对象身上
var a = {};
$.extend(a, { name: 'hello'}, {age: 30});
console.log(a);
{age: 30,name: 'hello'
}// 还可以做 深拷贝 和 浅拷贝
// 浅拷贝,两个指针指向同一个对象
var a = {};
var b = { name: 'hello' };$.extend(a, b);
a.name = 'hi';
alert(b.name);  // 可以正常修改var a = {};
var b = { name: { age: 30 } };$.extend(a, b);
a.name.age = 20;
alert(b.name.age);  // 可以正常修改 20// 如何让里面的age不受影响呢
var a = {};
var b = { name: { age: 30 } };
// 添加true为深拷贝,就是两个不同的对象
$.extend(true, a, b);
a.name.age = 20;
console.log(a);  // { name: { age: 20 } }
console.log(b);  // { name: { age: 30 } }

jQuery源码解析

// 只有一个对象自变量
// JQ扩展插件
$.extend({aaa: function(){alert(1);}
});
// 扩展JQ实例方法
$.fn.extend({aaa: function(){alert(3);}
});// 多个对象自变量,后面的对象都是扩展到第一个对象身上
var a = {};
$.extend(a, { name: 'hello'}, {age: 30}, {sex: 'man'});// 浅拷贝和深拷贝都是两个对象// 浅拷贝:拷贝第一层var a = {};var b = { name: 'hello', age: 30 };var a = {};var b = { name: { age: 30 } };$.extend(a, b);// 深拷贝:两个是不同的对象var a = {};var b = { name: { age: 30 } };$.extend(true, a, b);/*** 首先要分清楚要扩展到谁身上,如果没有扩展对象,就创建一个 {}* 在确定好扩展对象之后* 再确定是深拷贝还是浅拷贝(或是只有一个对象)*  浅拷贝:*        横向遍历{{}, {}, {}}    深度遍历只需遍历一层{{name:{age:{oo: 'rr'}}, kk: 'll'}, {sex: 'hh'}}, name = 原来的对象{age:{oo: 'rr'}}, 不需要再往下递归遍历*  深拷贝:*        {{}, {}, {}} 横向遍历每一个对象和属性,{{name:{age:30}}, {sex: 'hh'}}, 递归遍历属性是对象的情况,每次都创建新的对象* */// jQuery.extend 将一个方法扩展到函数下面,叫扩展静态方法
// jQuery.fn.extend 将一个方法扩展到原型对象下面,扩展实例方法
jQuery.extend = jQuery.fn.extend = function() {var options, name, src, copy, copyIsArray, clone,// 目标元素(扩展到谁身上)// 多个对象自变量:扩展到 arguments[0] 身上target = arguments[0] || {}, i = 1, // 开始遍历的下标length = arguments.length,// 默认不是深拷贝deep = false;// $.extend(true, a, b); 深拷贝的情况if ( typeof target === "boolean" ) {deep = target;// arguments[1]是否为 null undefined "" " 0target = arguments[1] || {};i = 2; }// 因为要扩展到target身上,所以必须是对象或函数if ( typeof target !== "object" && !jQuery.isFunction(target) ) {target = {};}// 看是不是插件的情况// $.extend({//   aaa: function(){//     alert(1);//   },//   bbb: function(){//     alert(2);//   }// });// $.aaa();// $.bbb();if ( length === i ) {// this 是 $ 或者 jQuery.fn = jQuery.prototypetarget = this;--i;}for ( ; i < length; i++ ) {// $.extend(a, { name: 'hello'}, {age: 30});// 从第二个参数开始,可以写n多个对象// 看一下argument后面的那些对象是否为空,并将arguments[i]赋值给optionsif ( (options = arguments[ i ]) != null ) {// name 是 键for ( name in options ) {// src是存在目标中的值src = target[ name ];// copy是options中所对应的值copy = options[ name ];// 防止循环引用// $.extend( a, { name: a });if ( target === copy ) {continue;}// 深拷贝// 如果是深拷贝 // var a = {};// var b = { name: { age: 30 } };// $.extend(true, a, b);// 比如说b就是一个对象// 也可以写成数组的形式 var c = [];if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {/*var a = { name : {job: 'it' }};var b = { name: { age: 30 }}$.extend(true, a, b);console.log(a);{name: {job: 'it',age: 30}}*/// 如果它是数组的情况if ( copyIsArray ) {copyIsArray = false;// clone是要扩展到的对象,对应这种情况{{name:{age:{oo: 'rr'}, kk: 'll'}}, {sex: 'hh'}}// 中的name,包含两个属性,所以得扩展到name身上,不能扩展到别地儿clone = src && jQuery.isArray(src) ? src : [];} else {clone = src && jQuery.isPlainObject(src) ? src : {};}// Never move original objects, clone themtarget[ name ] = jQuery.extend( deep, clone, copy );// 浅拷贝} else if ( copy !== undefined ) {// 扩展到target身上target[ name ] = copy;}}}}// Return the modified objectreturn target;
};

( 285 => 347)JQ的继承方法相关推荐

  1. java继承方法规则或规律

       方法的继承与属性的继承有很大的不同,属性任何继承方式均可,而方法则有各种限制,于是动力节点Java培训机构小编在这里做了一个简单的总结. 1.修饰符相同的方法覆盖,即只改内部,不改外部 2.访问 ...

  2. python oop 继承_oop-在Python中继承方法的文档字符串

    oop-在Python中继承方法的文档字符串 我有一个带有文档字符串的OO层次结构,它需要与代码本身一样多的维护. 例如., class Swallow(object): def airspeed(s ...

  3. jquery中ajax完整例子get,jq的ajax方法,jquery中ajax完整例子

    jq的ajax方法,jquery中ajax完整例子 相较与js异步对象的繁琐,jq的ajax对象结构更加清晰 一:ajax对象简述 ajax(Asynchronous JavaScript and X ...

  4. 【ES6】Class 类的使用与继承方法详解

    JavaScript 语言中,生成实例对象的传统方法是通过构造函数. ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. 基本上, ...

  5. JS中的类,类的继承方法

    大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){} 这就是一个很简单的Poson类, ...

  6. Javascript的对象继承方法

    许多OO 语言都支持两种继承方式: 接口继承:只继承方法签名 实现继承:继承实际的方法. 由于函数没有签名,在ECMAScript 中无法实现接口继承.ECMAScript 只支持实现继承 原型链继承 ...

  7. Java Part1 Day11继承 方法重写 super多态

    面向对象 一.内容回顾 封装;将类内部的属性隐藏private在类的内部,通过对外的公共接口(public setxxx getxxx)去操作,切薄数据的安全(合理) 实现过程:1属性私有 2封装方法 ...

  8. Python中类的继承方法

    Python中类与类之间可以继承,继承的叫父类或超类,新创建的叫子类.通过继承,子类可以使用父类的属性,这样可以有效减少代码的冗余度,提高代码重用性. 谈到类的继承,首先要了解构造函数或构造方法. 构 ...

  9. C语言写可联机存档的游戏,黑暗之魂3联机存档继承方法 DLC2怎么继承联机存档_3DM单机...

    不少玩家在打了最新的19号(1.12版本)DLC2升级补丁之后发现联机存档不能用了,那么联机补丁存档如何继承呢?下面为大家带来一种解决方法,如果你有更好的方法,不妨在下面的评论区留言分享一下吧! 黑暗 ...

最新文章

  1. R语言glmnet包拟合广义线性模型
  2. 禅道826版本SQL注入,登录绕过以及禅道826后台GetShell的小技巧
  3. Ubuntu之GCC:GCC编译器的简介、安装、使用方法之详细攻略
  4. 题目1457:非常可乐(广度优先遍历BFS)
  5. memcpy函数_[PART][BUG][MSVCRT][C][CCF NOI1097] 关于memcpy的坑
  6. html图片自动切换的幻灯片效果的,js带点自动图片轮播幻灯片特效代码分享
  7. python修改python unittest的运行顺序
  8. php构造方法什么时候使用,php:构造方法的说明详解
  9. 对话改写论文笔记(2021年初 )
  10. 如何评价《守望先锋》架构设计?
  11. 360无线网卡驱动linux,ubuntu安装360随身wifi驱动
  12. C笔记05-选择顺序结构,关系与相等,优先级和结合性
  13. python接入excel_在abaqus中使用python连接excel
  14. MATLAB入门学习笔记12
  15. TIA博途中如何通过PLC变量控制开始和停止记录数据?
  16. python识图自动化_Python自动化测试-验证识别
  17. Nginx 404 排查过程
  18. 重新启动mysql服务器
  19. Web-HTML+CSS入门笔记
  20. 大数据分析与机器学习领域Python兵器谱

热门文章

  1. Windows10优化系统,优化达到30多项,速度大幅提升,
  2. 音效、配乐素材网站,免费商用
  3. VMware下载安装、虚拟机创建、CentOS8镜像下载配置的具体步骤
  4. 《Search to Distill: Pearls are Everywhere but not the Eyes》论文阅读
  5. 「LOJ2474」「2018 集训队互测」北校门外的未来-笛卡尔树及其扩展+LCT
  6. 你不了解的 @reduxjs/toolkit 中的createApi
  7. 轻量化网络—ShuffleNet V1 V2理解
  8. 使用pycallgraph分析python代码函数调用流程以及框架
  9. buctoj-python 2022.5.19
  10. java string时间类型天数运算