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的的方法


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM