问题:模拟Object.create
解析:Object.create()方法创建个新对象,使用现有的对象来提供新创建的对象的proto。
//模拟Object.create
functioncreate(proto)
{functionF(){}
F.prototype=proto;
returnnewF();
}
问题:实现bind
解析:实现bind要做什么
返回个函数,绑定this,传递预置参数
bind返回的函数可以作为构造函数使。故作为构造函数时应使得this失效,但是传入的参数依然有效
//mdn的实现
if(!Function.prototype.bind)
{Function.prototype.bind=function(oThis){
if(typeofthis!==function){
//closestthingpossibletotheECMAScript5
//internalIsCallablefunction
thrownewTypeError(Function.prototype.bind-whatistryingtobeboundisnotcallable);
}
varaArgs=Array.prototype.slice.call(arguments,1),
fToBind=this,
fNOP=function()
{},fBound=function()
{
//thisinstanceoffBound===true时,说明返回的fBound被当做new的构造函数调
returnfToBind.apply(thisinstanceoffBound
?this
:oThis,
//获取调用时(fBound)的传参.bind返回的函数入参往往是这么传递的
aArgs.concat(Array.prototype.slice.call(arguments)));
};
//维护原型关系
if(this.prototype){
//Function.prototypedoesnthaveaprototypeproperty
fNOP.prototype=this.prototype;
}
//下行的代码使fBound.prototype是fNOP的实例,因此
//返回的fBound若作为new的构造函数,new生成的新对象作为this传入fBound,新对象的proto就是fNOP的实例
fBound.prototype=newfNOP();
returnfBound;
};
}
问题:实现apply方法
解析:apply原理与call很相似,不多赘述
//模拟apply
Function.prototype.myapply=function(context,arr)
{varcontext=Object(context)
window;
context.fn=this;
varresult;
if(!arr){
result=context.fn();
}else{
varargs=[];
for(vari=0,len=arr.length;ilen;i++)
{args.push(arr[+i+]);
}
result=eval(context.fn(+args+));
}
deletecontext.fn;
returnresult;
};
以上就是小科今天整理提供的Web前端开发面试题,希望为Web前端同学提供了有用的面试素材,以后小科每日均会提供Python、Web及MySQL数据库相关的习题。学习没有捷径,希望大家都能少走一些弯路,顺利找到工作!