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