前端网站设计物流官方网站建设方案
前端网站设计,物流官方网站建设方案,可以免费打广告的平台,淮安百度推广公司实现一个new操作符
//实现一个new操作符
function myNew(fn,...args){if(typeof fn ! function) {throw (fn is not a function)}//将对象的原型设置为fn的prototypelet resObject.create(fn.prototype)//使用 apply 执行构造函数 并传入参数 arguments 获取函数的返回值let r…实现一个new操作符
//实现一个new操作符
function myNew(fn,...args){if(typeof fn ! function) {throw (fn is not a function)}//将对象的原型设置为fn的prototypelet resObject.create(fn.prototype)//使用 apply 执行构造函数 并传入参数 arguments 获取函数的返回值let resultfn.apply(res,args)return result
}实现instanceof
//实现instanceoffunction myInstanceof(left,right){//如果左边不是引用数据类型if(typeof left ! object || left null) return false//获取左边的原型let protoObject.getPrototypeOf(left)while(true){//查找到底了if(protonull) return false//相等if(protoright.prototype) return true//顺着原型链继续查找protoObject.getPrototypeOf(proto)}
}实现浅拷贝
function shallowClone(obj){//如果是基础数据类型直接返回if(typeof obj ! object || objnull) return obj//如果是引用数据类型新开辟一个地址拷贝一层let newObjArray.isArray(obj) ? [] : {}for(let key in obj){newObj[key]obj[key]}return newObj
}实现深拷贝
function deepClone(obj){let cloneObjArray.isArray(obj)?[]:{};//遍历其中的keyfor(let key in obj){if(typeof obj[key]object){//递归cloneObj[key]deepClone(obj[key]);}else{cloneObj[key]obj[key];}}return cloneObj
}实现call/apply
// 实现call/apply//挂载到 Function.prototype上
Function.prototype.myCall function(val,...args) {//判断this指向需要指向function//谁调用这个方法this就指向谁if(typeof this ! function) {throw new TypeError(error)} //获取程序执行上下文let contextval || window// 将当前函数绑定到 context 上context.fn this;// 调用函数并获取结果const result context.fn(...args);// 删除临时属性delete context.fn;return result;
}实现防抖
// 防抖n秒后执行事件若n秒内再次触发则重新计时function debounce(fn,delay){//设置定时器let timer null;return function(){//如果还存在定时器清除定时器后重新计时if(timer) clearTimeout(timer);timersetTimeout(fn,delay)}
}实现节流
// 实现节流n秒内只允许一次若n秒内反复触发只有一次生效
function throttle(fn,delay){//设置开关是否允许执行let validtrue;return function(){if(!valid) return;//一定延迟后执行setTimeout((){fn();validtrue;},delay)}
}实现promise
//自定义promiseclass MyPromise{//定义三种状态static PENDING pending;static FULFILLED fulfilled;static REJECTED rejected;//定义构造函数constructor(fn){//默认等待状态this.statusMyPromise.PENDING;//默认结果this.resultnulltry{fn(this.resolve.bind(this),this.reject.bind(this))}catch(err){//捕获异常this.reject(err)}}//定义resolve方法resolve(result){if(this.statusMyPromise.PENDING){this.statusMyPromise.FULFILLEDthis.resultresult}}//定义reject方法reject(result){if(this.statusMyPromise.PENDING){this.statusMyPromise.REJECTEDthis.resultresult}}//定义then方法then(resolve,reject){//判断是否为空函数resolvetypeof resolvefunction?resolve:(){}rejecttypeof rejectfunction?reject:(){}//根据当前status返回不同结果if(this.statusMyPromise.FULFILLED){setTimeout((){resolve(this.result)})}if(this.statusMyPromise.REJECTED){setTimeout((){reject(this.result)})}}
}实现函数柯里化
//实现函数柯里化
function curry(fn,args){var numfn.lengthvar argsargs||[];//返回方法return function(){//把参数放入数组var arr[].slice.call(arguments);//将收集到的参数放入arr[].push.apply(arr,args)if(arr.lengthnum){//递归调用方法return curry.call(this,fn,arr)}return fn.apply(this,arr)}
}实现无限级目录树
function renderMenu(menuItems,parentElement){//获取页面上的ul元素const uldocument.createElement(ul);//遍历menuItems数组生成li元素menuItems.forEach(item{const lidocument.createElement(li);li.textContentitem.name;if(item.children item.children.length0){renderMenu(item.children,li);}ul.appendChild(li);})if(parentElement){parentElement.appendChild(ul);}
}实现快速排序
//实现快速排序function quickSort(arr){//递归中止条件if(arr.length1) return arr//定义基准值可任取这里取数组第一项let basearr[0]//基准值左侧和右侧的数组let leftArr[]let rightArr[]//遍历数组根据值的大小分别放入对应的数组for(let i1;iarr.length;i){if(arr[i]base) leftArr.push(arr[i])else rightArr.push(arr[i])}//合并数组let resArrquickSort(leftArr).concat(base,quickSort(rightArr))return resArr
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/87629.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!