- 手动实现debounce: 闭包缓存 timer, 再次触发时清除timer重新timeout赋值timer。
- 手动实现throttle: 闭包缓存 new date(), 再次触发时比较缓存date与当前date差值是否大于时间,如果小于则不执行,大于则执行方法并赋值当前时间给闭包的date。(用timeout改变falag也可以,但觉得不直观
- 手动实现call: 关键点在于一个,作用域this是什么?
我们知道,有两种作用域,全局和函数,那么全局中毋庸置疑,天然this指向window,函数中的this呢,我们只要记住,谁调用这个方法,谁就是这个this,ok,那么call的思路就是:
将传入的对象下增添一份该方法,而该方法本身就是this。
调用传入对象下的方法,将默认的arguments解构为数组去除第一个作为实参传入。
删除该方法,然后将返回值return。
Function.protoType.selfCall = function (context = window, ...args) {
const fn = Symbol('fn')
context[fn] = this;
const res = context[fn](..args);
delete contxt[fn]
return res
}
-
实现一个继承extend
// 这里直接用寄生组合
- 使用call传入this将父类的构造函数执行一遍来完成父类私有成员的自身创建(父亲有手,孩子也有
- 使用create浅复制份父类的原型链挂到自身上(父亲家的仓库有一把枪,你也可以通过父亲找到他仓库里的枪 Children.prototype = Object.create(Parent.prototype); Children.prototype.constructor = Children; // 有人会问为什么不用 new Parent 来挂载,那是因为 new 会执行 Parent 内部的构造函数,而我们这里只需要原型链继承上(公有属性方法的继承 // 私有属性才不要挂在子类的原型链上里 // 当然create返回的是个新对象,要把Child子类本身的构造函数再还原下的。
-
手动实现一个curry: 闭包一下入参,实现多参变单参传入,适用于多个异步结果或者函数化编程,拆分的更加粒子化(只有当参数length到了才会执行原来的fn,否则只是返回一个存储的参数的fn)
-
手动实现一个compose:闭包一下传入的fncs,实现管道式结果传入,流经各个函数,如果没有达到funcs的长度,则返回下一个函数,同时闭包缓存流出的结果进行下个函数入参。之前是这样的:let result = div2(mul3(add1(5)))
效果:let result = compose(div2, mul3, add1)(5);
- 手动实现一个bind: 闭包一下this,下次进来用call传入闭包的this,实现写死this
- 手动实现一个 instanceof : 使用 Object.getPrototypeof(proto) 获取隐式原型,进行递归判断,是则结束,不是则继续 Object.getPrototypeof() 继续作为入参proto判断。
- 手动实现一个 getType:与上同理,使用 Object.getPrototypeof 判断是否 为基本的几种类型,一层层往上找,总能找到的,找到后返回。或者使用 Object.prototype.toString.call(x) 获取判断返回。