function person(a,b,c) {
console.log(this.name);
console.log(a,b,c);
}
let p = { name:'张三' }
Function.prototype.newBind=function (object) {
if(typeof this !='function'){
throw new TypeError('错误')
}
let temp = this,//当newbind被new了之后这里的this就不是指向person了而是指向实例,发生了new构造
// arguments是对象不能使用数组切割第一个参数
// Array.prototype.slice.call()将有length属性的对象转化为数组
arr=Array.prototype.slice.call(arguments,1),
o=function(){},
newf= function(){
let arr2=Array.prototype.slice.call(arguments),
sumArr=[...arr,...arr2]
if(this instanceof o){//判断有没有使用new绑定,有的话就绑定到新实例上
temp.apply(this,sumArr)
}else{//没有的话就绑定到原来的object对象上
temp.apply(object,sumArr)
}
}
o.prototype=temp.prototype//将person的函数原型对象赋值给o
newf.prototype=new o//再将新函数newf的原型对象作为空函数o的实例进行串联
return newf
}
const newBind=person.newBind(p,'1','2')
const nb=new newBind('3')
//undefined
//1 2 3
const bind=person.bind(p,'1','2')
const b=new bind('3')
//undefined
//1 2 3
js中bind的实现
最新推荐文章于 2024-04-18 19:17:57 发布