( 285 => 347)JQ的继承方法
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的继承方法相关推荐
- java继承方法规则或规律
方法的继承与属性的继承有很大的不同,属性任何继承方式均可,而方法则有各种限制,于是动力节点Java培训机构小编在这里做了一个简单的总结. 1.修饰符相同的方法覆盖,即只改内部,不改外部 2.访问 ...
- python oop 继承_oop-在Python中继承方法的文档字符串
oop-在Python中继承方法的文档字符串 我有一个带有文档字符串的OO层次结构,它需要与代码本身一样多的维护. 例如., class Swallow(object): def airspeed(s ...
- jquery中ajax完整例子get,jq的ajax方法,jquery中ajax完整例子
jq的ajax方法,jquery中ajax完整例子 相较与js异步对象的繁琐,jq的ajax对象结构更加清晰 一:ajax对象简述 ajax(Asynchronous JavaScript and X ...
- 【ES6】Class 类的使用与继承方法详解
JavaScript 语言中,生成实例对象的传统方法是通过构造函数. ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. 基本上, ...
- JS中的类,类的继承方法
大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){} 这就是一个很简单的Poson类, ...
- Javascript的对象继承方法
许多OO 语言都支持两种继承方式: 接口继承:只继承方法签名 实现继承:继承实际的方法. 由于函数没有签名,在ECMAScript 中无法实现接口继承.ECMAScript 只支持实现继承 原型链继承 ...
- Java Part1 Day11继承 方法重写 super多态
面向对象 一.内容回顾 封装;将类内部的属性隐藏private在类的内部,通过对外的公共接口(public setxxx getxxx)去操作,切薄数据的安全(合理) 实现过程:1属性私有 2封装方法 ...
- Python中类的继承方法
Python中类与类之间可以继承,继承的叫父类或超类,新创建的叫子类.通过继承,子类可以使用父类的属性,这样可以有效减少代码的冗余度,提高代码重用性. 谈到类的继承,首先要了解构造函数或构造方法. 构 ...
- C语言写可联机存档的游戏,黑暗之魂3联机存档继承方法 DLC2怎么继承联机存档_3DM单机...
不少玩家在打了最新的19号(1.12版本)DLC2升级补丁之后发现联机存档不能用了,那么联机补丁存档如何继承呢?下面为大家带来一种解决方法,如果你有更好的方法,不妨在下面的评论区留言分享一下吧! 黑暗 ...
最新文章
- R语言glmnet包拟合广义线性模型
- 禅道826版本SQL注入,登录绕过以及禅道826后台GetShell的小技巧
- Ubuntu之GCC:GCC编译器的简介、安装、使用方法之详细攻略
- 题目1457:非常可乐(广度优先遍历BFS)
- memcpy函数_[PART][BUG][MSVCRT][C][CCF NOI1097] 关于memcpy的坑
- html图片自动切换的幻灯片效果的,js带点自动图片轮播幻灯片特效代码分享
- python修改python unittest的运行顺序
- php构造方法什么时候使用,php:构造方法的说明详解
- 对话改写论文笔记(2021年初 )
- 如何评价《守望先锋》架构设计?
- 360无线网卡驱动linux,ubuntu安装360随身wifi驱动
- C笔记05-选择顺序结构,关系与相等,优先级和结合性
- python接入excel_在abaqus中使用python连接excel
- MATLAB入门学习笔记12
- TIA博途中如何通过PLC变量控制开始和停止记录数据?
- python识图自动化_Python自动化测试-验证识别
- Nginx 404 排查过程
- 重新启动mysql服务器
- Web-HTML+CSS入门笔记
- 大数据分析与机器学习领域Python兵器谱
热门文章
- Windows10优化系统,优化达到30多项,速度大幅提升,
- 音效、配乐素材网站,免费商用
- VMware下载安装、虚拟机创建、CentOS8镜像下载配置的具体步骤
- 《Search to Distill: Pearls are Everywhere but not the Eyes》论文阅读
- 「LOJ2474」「2018 集训队互测」北校门外的未来-笛卡尔树及其扩展+LCT
- 你不了解的 @reduxjs/toolkit 中的createApi
- 轻量化网络—ShuffleNet V1 V2理解
- 使用pycallgraph分析python代码函数调用流程以及框架
- buctoj-python 2022.5.19
- java string时间类型天数运算