js实现call
Function.prototype.myCall=function(context,...params){
if(context===null || context===undefined){
context=window;
}else{
context=Object(context)
}
const key=Symbol();
context[key]=this;
const result=context[key](...params);
delete context[key];
return result;
}
js实现apply
Function.prototype.myApply=function(context){
if(context===null || context===undefined){
context=window;
}else{
context=Object(context)
}
//判断是否是类数组
function isArrayLike(o) {
if(o && typeof o==='object' && isFinite(o.length) && o.length>=0 && o.length===Math.floor(o.length) && o.length<4294967296){
return true
}else{
return false;
}
}
const key=Symbol();
context[key]=this;
let args=arguments[1],result;
if(args){
if(!Array.isArray(args) && !isArrayLike(args)){
throw new TypeError('第二个参数不是数组也不是类数组')
}else{
result=context[key](...args);
}
}else{
result=context[key]()
}
delete context[key];
return result;
}
js实现bind
Function.prototype.myBind=function(obj,...params){
const thisFn=this;
const bindFn=function(...secondParams){
const context=this instanceof bindFn ? this : Object(obj);
return thisFn.call(context,...params,...secondParams)
}
bindFn.prototype=Object.create(thisFn.prototype);
return bindFn;
}