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