16-JS封装:extend方法

目录

一、封装需求

二、实现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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸爬打滚的小M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值