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

浙公网安备 33010602011771号