- 手写call(返回结果,参数是列表参数)
Function.prototype.newCall = function(newObject,...args){ //设置上下文 let context = Object(newObject)||window; //用symbol防止同属性名的覆盖 let fn = Symbol() //赋值调用的方法,并且改变this指向 context[fn] = this; //执行方法 let res = context[fn](...args); //运行完毕,删除多余的属性 delete context[fn] //返回结果 return res }
- 手写apply(返回结果,参数是数组参数)
Function.prototype.newApply = function(newObject,args){ //设置上下文 let context = Object(newObject)||window //用symbol防止同属性名的覆盖 let fn = Symbol() //赋值调用的方法,并且改变this指向 context[fn] = this; //执行方法 const res = context[fn](...args) //运行完毕,删除多余的属性 delete context[fn] //返回结果 return res }
- 手写bind(返回方法,参数是列表参数)
Function.prototype.myBind = function(newObject,args){ //设置上下文 let context = Object(newObject)||window //bind需要返回一个方法 return function(){ //用symbol防止同属性名的覆盖 let fn = Symbol() //赋值调用的方法,并且改变this指向 context[fn] = this; //执行方法 let res = context[fn](...args) //运行完毕,删除多余的属性 delete context[fn] //返回结果 return res } }
- 手写防抖(防抖是在距离上次触发事件一定时间内,只调用最后一次的执行,例如点了鼠标十次,每次间隔不超过一秒钟(假如这一秒钟为设置的阈值),则只执行第十次)
//设置默认值time = 0 function fangdou(fun,time=0){ //判断传入的参数是否是方法 if(fun instanceof Function){ //定时器 let timer = null; //返回一个方法(闭包) return function(...args){ //如果有定时器了,先清除 if(timer){ clearTimeout(timer) } //定时执行内容 timer = setTimeout(()=>{fun(...args)},time) } } }
- 手写节流(在一定时间内,只调用第一次执行)
//设置默认值time = 0 function jieliu(fun,time=0){ //判断传入的参数是否是方法 if (fun instanceof Function) { //设置一个标识 let flag = true //返回一个方法(闭包) return function(...args){ if(flag){ //设置flag flag = false; //定时执行方法,并且重置flag setTimeout(function(){fun(...args); flag = true},time) } } } }
- 手写new
function myNew(Obj,...args){ //创建一个空的对象 let obj = {} //设置obj的原型 obj._proto_ = Obj.prototype //call参数,改变this指向 let res = Obj.call(obj,...args) if (res instanceof Object) { //如果new里面return对象,则返回return的对象, return res }else{ //否则返回新生成的对象 return obj } }
面试中用到的手写方法
于 2023-06-01 14:30:26 首次发布