//实现一个new操作符functionmyNew(fn,...args){if(typeof fn !=='function'){throw('fn is not a function')}//将对象的原型设置为fn的prototypelet res=Object.create(fn.prototype)//使用 apply 执行构造函数 并传入参数 arguments 获取函数的返回值let result=fn.apply(res,args)return result
}
实现instanceof
//实现instanceoffunctionmyInstanceof(left,right){//如果左边不是引用数据类型if(typeof left !=='object'|| left ===null)returnfalse//获取左边的原型let proto=Object.getPrototypeOf(left)while(true){//查找到底了if(proto==null)returnfalse//相等if(proto==right.prototype)returntrue//顺着原型链继续查找
proto=Object.getPrototypeOf(proto)}}
//实现函数柯里化functioncurry(fn,args){var num=fn.length
var args=args||[];//返回方法returnfunction(){//把参数放入数组var arr=[].slice.call(arguments);//将收集到的参数放入arr[].push.apply(arr,args)if(arr.length<num){//递归调用方法returncurry.call(this,fn,arr)}returnfn.apply(this,arr)}}