• js-手写call,apply,bind


    function sum(){
        console.log(this.name)
    }
    Function.prototype.mycall=function(myobj,...args){
            if(typeof myobj==='Function'){
                 throw new TypeError('error')
           }
          const  fn=symbol('fn')    //唯一值
          myobj=myobj || window  //若没有传入对象,则绑定到window上
          myobj[fn]=this         //把函数赋值到对象的某个属性
          const result=myobj[fn](...args)
         delete  myobj[fn]       //删除fn声明
         return result
    }
    const obj={
    name:'泪痕'
    }
    sum.mycall(obj) //泪痕
    

     以上就是手动实现call的代码

    function sum(){
       console.log(this.name)
    }
    Function.prototype.myapply=function(myobj,args){
           if(typeOf myobj==='Function'){
                 throw new TypeError('error')
           }
          const  fn=symbol('fn')    //唯一值
          myobj=myobj || window  //若没有传入对象,则绑定到window上
          myobj[fn]=this         //把函数赋值到对象的某个属性
          const result=myobj[fn](...args)
         delete  myobj[fn]       //删除fn声明
         return result
    }
    const obj={
    name:'泪痕'
    }
    sum.myapply(obj,[]) //泪痕

     以上就是实现一个apply的代码

    function sum(name){
     this.name=name
    }
    Function.prototype.mybind=function(myobj,...args){
           if(typeOf myobj==='Function'){
                 throw new TypeError('error')
           }
          let self=this
          let fnNop = function () {} // 定义一个空函数
          let fnBound=function(){
              // 检测 New , 如果当前函数的this指向的是构造函数中的this 则判定为new 操作
               let _this=this instanceof self?this:myobj
               self.apply(_this,args.concat(Array.prototype.slice.call(arguments)))    
          } 
    
        if (this.prototype) {
           fnNop.prototype = this.prototype;
       }
    
       fnBound.prototype = new fnNop();
       return fnBound
    }
    

      

    const obj={}
    let outPut=sum.mybind(obj)
    outPut('图图')
    obj.name//图图
    const outPut1=new outPut('小样')
    obj.name//图图
    outPut1.name//小样
    

      

    以上就是实现bind的的方法

  • 相关阅读:
    web前端
    touch.js——手机端的操作手势
    js实现touch移动触屏滑动事件
    Javascript闭包(Closure)
    javascript的垃圾回收机制与内存管理
    浏览器渲染页面
    Web前端面试题目汇总
    gulp VS grunt
    [编写高质量代码:改善java程序的151个建议]建议88 用枚举实现工厂方法模式更简单
    [编写高质量代码:改善java程序的151个建议]建议86,87 default值,valueOf
  • 原文地址:https://www.cnblogs.com/wmydb/p/12666250.html
Copyright © 2020-2023  润新知