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