实现new

new Foo的过程
1、创建一个新对象,他的原型__proto__指向构造函数的prototype
2、执行构造函数,重新指定this为该新对象,并传入对应参数
3、返回一个对象,如果构造函数返回一个对象,则返回这个对象,否则返回创建的新对象

编码如下:

  1. // 模拟new的实现
  2. let newMock = function () {
  3. let argus = Array.prototype.slice.apply(arguments);
  4. let Foo = argus.shift();
  5. let target = Object.create(Foo.prototype);
  6. let foo = Foo.apply(target, argus);
  7. if (typeof foo === 'object') {
  8. // 比如构造函数返回了一个Object,工厂模式之类的
  9. return foo;
  10. } else {
  11. return target;
  12. }
  13. }
  14. // 构造函数
  15. let Person = function (name) {
  16. this.name = `i am ${name}`;
  17. this.say = function () {
  18. console.log(this)
  19. }
  20. }
  21. // 使用
  22. let p = newMock(Person, 'www')
  23. console.log(p instanceof Person) // === true 说明newMock使用成功

实现Promise

实现bind

实现节流和防抖

  1. /**
  2. * 防抖函数
  3. * 函数停止1s后执行
  4. * @param func
  5. * @param wait
  6. * @returns {Function}
  7. */
  8. const debounce = (func, wait) => {
  9. let timeout;
  10. return function () {
  11. let context = this;
  12. let argus = arguments;
  13. if (timeout) clearTimeout(timeout);
  14. timeout = setTimeout(() => {
  15. func.apply(context, argus)
  16. }, wait);
  17. }
  18. };
  19. /**
  20. * 节流函数
  21. * 1s执行一次目标函数
  22. * @param func
  23. * @param wait
  24. * @returns {Function}
  25. */
  26. const throttle = (func, wait) => {
  27. let previous = 0;
  28. return function () {
  29. let now = Date.now();
  30. let context = this;
  31. let argus = arguments;
  32. if (now - previous > wait) {
  33. func.apply(context, argus);
  34. previous = now;
  35. }
  36. }
  37. };