16-JS封装:extend方法

news2024/12/23 6:49:09

目录

一、封装需求

二、实现1:jQuery.extend

三、实现2:通过原型jQuery.fn.extend

四、优化


一、封装需求

封装需求:

$.extend:

var obj={ name:"xxx",age:18}

var obj3={ gender:"女"}

var obj2={};

将obj、obj3中的属性一一的遍历添加到obj2对象中

$.extend(obj2,obj,obj3)

二、实现1:jQuery.extend

1、这里的extend方法参数并不确定,所以建议不要指定形参,通过函数内置对象arguments来进行操作

jQuery.extend = function(...args){

        }

2、进行对象拷贝,需要将第二个参数及其后面的所有参数中的属性遍历添加到第一个参数中

jQuery.extend = function(...args){
            
            console.log(args);

            const target = args[0]; //获取第一个参数

            for(let i = 1;i<args.length;i++){
                
                let arg = args[i];//获取每一个实参:对象
                
                for (let key in arg) {//取出对象中的每一个属性
                    
                    target[key] = arg[key];//把该属性添加到第一个参数中
                }
            }

            return target;//返回第一个参数
        }

3、 var p = {};

      $.extend(p,{a:10},{b:20},{c:30})

三、实现2:通过原型jQuery.fn.extend

第二个extend方法:其实就是为了给$.fn.extend:这是编写jquery插件的核心方法

功能:就是把这些方法添加到原型中

    $.fn.extend({
        dateTimePicker(){

        },
        getDate(){

        }
    })

1、在原型中添加extend方法

        jQuery.fn.extend = jQuery.extend = function(...args){
         

        }

2个extend方法区别在于:
1)接收数据的对象发生了变化
  $.extend:第一个实参
  $.fn.extend:this
2)提供数据的对象发生了变化:
  $.extend:第二个参数及其后面的参数
  $.fn.extend:所有的参数

2、判断传进来的数据源的形式

1)第一个参数是target,其余参数都是source

2)所有参数都是source

            let target,source=[];

            source=[...args];
            
            //判断2种情况       
            //  $.extend    -->jQuery.extend 方法调用形式
            if(this === jQuery){
                //$.extend
                target=args[0];
                
                source.splice(0,1); //删除第一个元素
            }else{
                //$.fn.extend
                target = this;
            }

3、实现拷贝部分的逻辑

source.forEach(function(item,index){
                //item:就是每一个数据源对象(提供数据的对象)
                
                //取出item对象中的每一个属性:for...in
                Object.keys(item).forEach((key)=>{
                    //key就是对象中每一个属性名
                    target[key]=item[key];
                })

                //target如果本身就是一个对象字面量
                //target={ ...target,...item };

                //考虑的完美一些:如果target本身并不是一个对象字面量,上述的方式就修改了target数据类型
                Object.assign(target,item)

            });

四、优化

a、Object.assign其实是支持多参数

b、优化的思路:Object.assign(target,source[0],source[1],source[2]......)

将实现2中的实现拷贝部分的逻辑替换成如下代码

 Object.assign(target,...source)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1898949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

S7-1200PLC学习记录

文章目录 前言一、S7-12001.数字量输入模块2. PNP接法和NPN接法 二、博图软件1. 位逻辑运算Part1. 添加新设备&#xff08;添加PLC&#xff09;Part2. 添加信号模块Part3. 添加信号板中模块Part4. 添加新块Part5. Main编程文件案例1案例2 -( S )- 和 -( R )-完整操作过程&#…

ERROR | Web server failed to start. Port 8080 was already in use.

错误提示&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process thats listening on port 8080 or configure thi…

C++——模板详解(下篇)

一、非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之后的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#…

Swift 中的方法调用机制

Swift 方法调用详解&#xff1a;与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中&#xff0c;Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序&#xff0c;但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…

maven项目使用netty,前端是vue2,实现通讯

引入的java包 <!-- 以下是即时通讯--><!-- Netty core modules --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.76.Final</version> <!-- 使用最新的稳定版本…

C++中的引用——引用的注意事项

1.引用必须初始化 2.引用在初始化后不可以改变 示例&#xff1a; 运行结果&#xff1a;

03:EDA的进阶使用

使用EDA设计一个38译码器电路和245放大电路 1、38译码器1.1、查看74HC138芯片数据1.2、电路设计 2、245放大电路2.1、查看数据手册2.2、设计电路 3、绘制PCB3.1、导入3.2、放置3.3、飞线3.4、特殊方式连接GND3.5、泪滴3.6、配置丝印和划分区域3.7、添加typc接口供电 1、38译码器…

案例精选 | 聚铭网络助力南京市玄武区教育局构建内网日志审计合规体系

南京市玄武区教育局作为江苏省教育领域的先锋机构&#xff0c;其工作重点涵盖了教育政策的实施、教育现代化与信息化的融合、教育资源的优化、教育质量的提升以及教育公平的促进。在这一背景下&#xff0c;网络安全管理成为了确保教育信息化顺利推进的关键环节之一。 根据玄武…

【CV炼丹师勇闯力扣训练营 Day24:§7 回溯3】

CV炼丹师勇闯力扣训练营 代码随想录算法训练营第24天 93 复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.…

tensorboard安装失败,怎么办?

标题tensorboard未安装报错&#xff0c;如下图所示&#xff1a; 解决方法尝试&#xff1a; 这些方法都可以试一下&#xff0c;因为每个人的情况可能不同&#xff0c;成功的方法也不同。 1、在pycharm中Pip失败 2、 在pycharm中Conda 失败 3、在Pycharm中换清华源失败 4、直接…

软件是什么?一个软件到底是哪些部分组成的-软件到底有哪些分支呢?

https://doc.youyacao.com/117/2163 软件是什么&#xff1f;一个软件到底是哪些部分组成的-软件到底有哪些分支呢&#xff1f; 何为软件 软件定义 的本质是通过软件编程实现硬件资源的虚拟化、灵活、多样和定制化功能&#xff0c;以最大化系统运行效率和能量效率。它基于硬…

面试题-Spring家族与SpringIOC

1.spring家族的介绍 Spring简单图&#xff1a; 2.IOC原理 IOC就是原先代码里需要开发者实现对象的创建和关系依赖&#xff0c;反转交给SpringIOC容器管理对象的生命周期和对象之间的依赖关系。 依赖注入的方式&#xff1a; Setter&#xff1a;实现特定属性的public sette…

资源监视器 查看写入磁盘的文件

"Win R" 组合键来打开运行对话框&#xff0c;然后输入 "resmon" 并按下回车键&#xff0c;或者在开始菜单中搜索 "资源监视器" 并打开它。 可以查看时哪个服务在往盘里写日志或者文件

pytest-rerunfailures:优化测试稳定性的失败重试工具

笔者在执行自动化测试用例时&#xff0c;会发现有时候用例失败并非代码问题&#xff0c;而是由于服务正在发版&#xff0c;导致请求失败&#xff0c;从而降低了自动化用例的稳定性&#xff0c;最后还要花时间定位到底是自身case的原因还是业务逻辑问题&#xff0c;还是其他原因…

vue单独部署到宝塔教程

配置反向代理 注意:如果目标网站是https则写https否则写http 2.关于解决部署后无法刷新,直接报错404 location / { try_files $uri $uri/ /index.html; }

记某大学智慧云平台存在弱口令爆破水平越权信息泄露Wx_SessionKey篡改 任意用户登录漏洞

扫码获取网安教程 0x1 前言 本篇文章是记录最近给一所大学做渗透测试时该学校存在的漏洞&#xff08;目前已经修复&#xff09;。我是先找该学校的微信小程序的资产&#xff0c;因为各位佬们也知道&#xff0c;微信小程序相对于web应用服务端来讲维护较少&#xff0c;所有漏洞…

【JavaWeb程序设计】Web基础-JavaScript

目录 一、函数与事件的使用 1. 编写一个html页面&#xff0c;使用Javascript完成数字的平方计算。 1.1 运行截图 1.2 JS代码 1.3 HTML代码 2. 要求文本框中只能输入字母 2.1 运行截图 2.2 下载jquery-3.4.1并引用 2.3 JS代码 2.4 HTML代码 3. 在文本框分别输入两个…

使用 mongo2neo4j 和 SemSpect 通过各种方式进行图探索

用于可视化和探索每个 MEAN 堆栈背后的数据图的 ETL 您是否正在努力回答有关 MEANS Web 服务数据的紧急问题&#xff1f;哪里有 BI 可以快速回答“上个季度哪些亚洲的artisan.plus 用户触发了订单&#xff1f;”这个问题&#xff0c;而无需编写查询&#xff1f;使用 mongo2neo4…

通过 Parallels Desktop 虚拟机安装运行 macOS 15 Sequoia

在 Apple 的 WWDC 24 大会上&#xff0c;macOS Sequoia 15 成为全场热议的焦点。 作为科技爱好者和开发者&#xff0c;我们都迫不及待想要体验这些最新功能。但如果直接把整个 Mac 升级到测试版&#xff0c;可能不太现实&#xff0c;特别是当你需要保持主系统稳定的时候。 幸…

速刷edurank(1)

python安全开发 python安全开发 python安全开发前言一、平台edu二、使用步骤1.引入库2.功能**完整代码**完整代码 总结 前言 目的&#xff1a;想快速的搜集edu的域名 一、平台edu https://src.sjtu.edu.cn/rank/firm/0/?page2 二、使用步骤 1.引入库 代码如下&#xff08…