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(){
 console.log(this.name)
console.log(arguments)
}
Function.prototype.mybind=function(myobj,...args){
       if(typeOf myobj==='Function'){
             throw new TypeError('error')
       }
      let self=this
let bound=function(){
self.apply(this instanceof self ? this: myobj,args.concat(Array.prototype.slice.call(arguments)) }
}
const obj={name:'泪痕'}
sum.mybind(obj,1,2,3)//泪痕

  

以上就是实现bind的的方法

猜你喜欢

转载自www.cnblogs.com/wmydb/p/12666250.html