You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionobjectFactory(func){if(typeoffunc!=='functio'){thrownewError('请传入一个函数')}letobj=Object.create(func.prototype);letargs=[...arguments].slice(1);constresult=func.apply(obj,args);letobjectResult=typeofresult==='object'&&result!==null;letfuncResult=typeofresult==='function';return(objectResult||funcResult) ? result : obj;}
bind实现了什么
bind返回一个函数
bind可以传入参数
bindFunc返回的函数也可以传入参数
this指向bindObjNew
Function.prototype.myBind=function(context){if(typeofthis!=='function'){thrownewError('请输入一个函数');}letargs=[...arguments].slice(1);let_this=this;letfBound=function(){letargs2=[...arguments];// return _this.apply(context, [...args, ...args2]);return_this.apply(thisinstanceoffBound ? this : context,[..args, ...args2])}returnfBound;}
Bind函数实现:
返回一个函数
可以传入参数
Function.prototype.myBind=function(context){if(typeofthis!='function'){thrownewTypeError('error')}let_this=this// 函数剩余的参数letargs=[...arguments].slice(1)returnfunctionF(){// 因为返回的是一个函数,所以可以 new F(),所以要进行判断if(thisinstanceofF){returnnew_this(...args, ...arguments);}return_this.apply(context,args.concat(...arguments));}}
functionmyNew(){letobj=newObject();letconstrctor=Array.prototype.shift.call(arguments);obj.__proto__=constrctor.prototype;letres=constrctor.apply(obj,arguments);returntypeofres==="object" ? res : obj;}
functionobjectFactory(){varobj=newObject(),// 从Object.prototype上克隆一个对象Constructor=[].shift.call(arguments);// 取得外部传入的构造器varF=function(){}F.prototype=Constructor.prototype;obj=newF();// 指向正确的原型varres=Constructor.apply(obj,arguments);// 借用外部传入的构造器给obj设置属性returntypeofres==='object' ? res : obj;// 确保构造器总是返回一个对象}
Function.prototype.myBind=function(context){if(typeofthis!=='function'){thrownewError('Function.prototype.bind - what is trying to be bound is not callable');}varselft=this;varargs=Array.prototype.slice.call(arguments,1);varfNOP=function(){};varfBound=function(){varbindArgs=Array.prototype.slice.call(arguments);returnself.apply(thisinstanceoffNOP ? this : context,args.concat(bindArgs));}fNOP.prototype=this.prototype;fBound.prototype=newfNOP();returnfBound;}
The text was updated successfully, but these errors were encountered:
new 运算符:
运算符创建一个用户定义的对象类型的实例 或 具有构造函数的内置对象类型之一。
bind 函数:
方法会创建一个新函数,当这个新函数被调用时,bind()的第一个参数将作为它运行时的this,之后的一系列参数将会传递的实参前传入作为它的参数。
bind函数的特点:
new原理:
new的运行过程:
__proto__
指向构造函数的prototype
this
模拟手写new
模拟手写bind
new关键字实现了什么
[[prototype]]
属性指向构造函数的prototypebind实现了什么
Bind函数实现:
New 实现:
__proto__
指向构造函数的prototypebind:
new实践
The text was updated successfully, but these errors were encountered: