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