zoukankan      html  css  js  c++  java
  • 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的的方法

  • 相关阅读:
    asp.net mvc(2013424)——基本知识
    asp.net mvc(2013425)——使用模板页
    jquery实现tab切换核心代码
    asp.net mvc(2013422 )——准备入门
    也说C#串行化
    Net Assembly.GetExecutingAssembly() 和 Assembly.GetCallingAssembly()的区别
    log (一)
    C# 重载和从写的区别
    log4net
    C# 反射
  • 原文地址:https://www.cnblogs.com/wmydb/p/12666250.html
Copyright © 2011-2022 走看看