面试中用到的手写方法

  1. 手写call(返回结果,参数是列表参数)
        Function.prototype.newCall = function(newObject,...args){
          //设置上下文
          let context = Object(newObject)||window;
          //用symbol防止同属性名的覆盖
          let fn = Symbol()
          //赋值调用的方法,并且改变this指向
          context[fn] = this;
          //执行方法
          let res = context[fn](...args);
          //运行完毕,删除多余的属性
          delete context[fn]
          //返回结果
          return res
        }
  2. 手写apply(返回结果,参数是数组参数)
        Function.prototype.newApply = function(newObject,args){
          //设置上下文
          let context = Object(newObject)||window
          //用symbol防止同属性名的覆盖
          let fn = Symbol()
          //赋值调用的方法,并且改变this指向
          context[fn] = this;
          //执行方法
          const res = context[fn](...args)
          //运行完毕,删除多余的属性
          delete context[fn]
          //返回结果
          return res
        }
  3. 手写bind(返回方法,参数是列表参数)
        Function.prototype.myBind = function(newObject,args){
          //设置上下文
          let context = Object(newObject)||window
          //bind需要返回一个方法
          return function(){
             //用symbol防止同属性名的覆盖
            let fn = Symbol()
            //赋值调用的方法,并且改变this指向
            context[fn] = this;
            //执行方法
            let res = context[fn](...args)
            //运行完毕,删除多余的属性
            delete context[fn]
            //返回结果
            return res
          }
        }
  4. 手写防抖(防抖是在距离上次触发事件一定时间内,只调用最后一次的执行,例如点了鼠标十次,每次间隔不超过一秒钟(假如这一秒钟为设置的阈值),则只执行第十次) 
        //设置默认值time = 0
        function fangdou(fun,time=0){
          //判断传入的参数是否是方法
          if(fun instanceof Function){
            //定时器
            let timer = null;
            //返回一个方法(闭包)
            return function(...args){
              //如果有定时器了,先清除
              if(timer){
                clearTimeout(timer)
              }
              //定时执行内容
              timer = setTimeout(()=>{fun(...args)},time)
            }
          }
        }
  5. 手写节流(在一定时间内,只调用第一次执行) 
        //设置默认值time = 0
        function jieliu(fun,time=0){
          //判断传入的参数是否是方法
          if (fun instanceof Function) {
            //设置一个标识
            let flag = true
            //返回一个方法(闭包)
            return function(...args){
              if(flag){
                //设置flag
                flag = false;
                //定时执行方法,并且重置flag
                setTimeout(function(){fun(...args); flag = true},time)
              }
            }
          }
        }
  6. 手写new
        function myNew(Obj,...args){
          //创建一个空的对象
          let obj = {}
    
          //设置obj的原型
          obj._proto_ = Obj.prototype
    
          //call参数,改变this指向
          let res = Obj.call(obj,...args)
          
          if (res instanceof Object) {
            //如果new里面return对象,则返回return的对象,
            return res
          }else{
            //否则返回新生成的对象
            return obj
          }
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值