一些语法块

防抖函数

"use-strict"
/**
 * 自己实现防抖函数
 */
function debounce(func, delay) {
  let timer
  return function (...args) {
    if (timer) {
      clearTimeout(timer) //如果用户再次输入,则把前一个 setTimeout clear 掉
    }
    timer = setTimeout(() => {
      func.call(this, args)
    }, delay) // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 delay 间隔内如果还有字符输入的话,就不会执行 fnnc 函数
  }
}

节流函数

"use-strict"
/**
 * 自己实现节流函数
 */
function throttle(func, delay) {
  let canRun = true
  return function (...args) {
    if (!canRun) {
      return //在函数开头判断标志是否为 true,不为 true 则中断函数
    }
    canRun = false //将canRun 设置为 false,防止执行之前再被执行
    setTimeout(() => {
      func.call(this, args)
      canRun = true // 执行完事件(比如调用完接口)之后,重新将这个标志设置为 true。当定时器没有执行的时候标记永远是false,在开头被return掉
    }, delay)
  }
}

组合式继承

"use-strict"
/***
 * 组合式继承
 * 通过call继承Parent的属性,并传入参数
 * 将Child的原型对象指向Parent的实例,从而继承Parent的函数
 */
function Parent(value) {
  this.val = value
}
Parent.prototype.getValue = function () {
  console.log(this.val)
}
function Child(value) {
  //继承Parentd的属性
  Parent.call(this, value)
}
Child.prototype = new Parent()

//test
const child = new Child("Child")
const parent = new Parent("Parent")

console.log(child instanceof Parent) // true

child.getValue()
parent.getValue()

组合寄生式继承

"use-strict";
/***
 * 寄生组合式继承
 * 通过call继承Parent的属性,并传入参数
 * 通过Object.create()继承Parent的函数
 */
function Parent(value) {
  this.val = value;
}
Parent.prototype.getValue = function () {
  console.log(this.val);
};
function Child(value) {
  //继承Parentd的属性
  Parent.call(this, value);
}
Child.prototype = Object.create(Parent.prototype, {
  constructor {
    value Child,
    writable true,
    configurable true,
    enumerable false,
  },
});

//test
const child = new Child("Child");
const parent = new Parent("Parent");

console.log(child instanceof Parent); // true

child.getValue();
parent.getValue();

实现New操作符

"use-strict";
/**
 * 自己实现New操作符
 */
function myNew(Cons, ...args) {
  let obj = {};
  obj.__proto__ = Cons.prototype;
  let res = Cons.call(obj, args);
  return typeof res === "object" ? res  obj;
}

//test
function Person(value) {
  this.name = value;
}
Person.prototype.getName = function () {
  console.log(this.name);
  return this.name;
};
const suyechun = myNew(Person, "syc");
suyechun.getName();

实现instance of

"use-strict"
/**
 * 自己实现instanceof
 * 实现原理为利用原型链
 * typeof只能判断原始类型(除了null会输出object),引用类型都会输出object
 * instanceof 只能判断对象
 * 还有一种判断方法,Object.prototype.toString.call();会输出"[object 类型值]"
 */
function myInstanceof(left, right) {
  let rightProto = right.prototype
  let leftValue = left.__proto__
  while (true) {
    if (leftValue === null) {
      return false
    }
    if (leftValue === rightProto) {
      return true
    }
    leftValue = leftValue.__proto__
  }
}
//test
function Person(value) {
  this.name = value
}
Person.prototype.getName = function () {
  console.log(this.name)
  return this.name
}
const suyechun = new Person("syc")
console.log(myInstanceof(suyechun, Person))

斐波那契数列

function* fibonacci() {
  let [prev, curr] = [0, 1]
  for (;;) {
    yield curr
    ;[prev, curr] = [curr, prev + curr]
  }
}

for (let n of fibonacci()) {
  if (n > 1000) break
  console.log(n)
}