实现:

// Person('Li')/* 输入:Hi! This is Hank!*/// Person('Dan').sleep(3).eat('dinner')/* 输入:Hi! This is Hank!// 期待10秒..Wake up after 10Eat dinner~*/// Person('Jerry').eat('dinner~').eat('supper~')/* 输入:Hi This is Hank!Eat dinner~Eat supper~*/Person('Smith').sleepFirst(2).eat('supper')/* 期待5秒,输入Wake up after 5Hi This is Hank!Eat supper*/
function Person(name) {  return new CreatePerson(name)}class CreatePerson {  constructor(name){    this.tasks = [] // 外围,应用队列(数组)来存储要执行的函数    this.tasks.push(()=> console.log(`Hi! This is ${name}`))    this.runTask()  }  runTask() {    // 要害!利用宏工作将事件提早执行    // 如果遇到 sleepFirst,能够先将 sleepFirst 压入工作队列,而后按程序执行    setTimeout(() => this.exector())  }  exector() {    if(this.tasks.length === 0) return // 递归进口    const task = this.tasks.shift() // 取出工作    if(typeof task === "number") {      setTimeout(() => {        console.log(`Wake up after ${task}`)        this.exector() // 递归本身      }, 2000)    }        if (typeof task === 'function') {      task()      this.exector() // 递归本身    }    return this  }  // 保护各种工作,用工作队列存储  eat(food) {    this.tasks.push(() => console.log(`Eat ${food}~`)) // 惯例操作,塞进工作队列    return this  }  sleep(time) {    this.tasks.push(time) // 惯例操作,塞进工作队列    return this  }  sleepFirst(time) {    console.log(1);    this.tasks.unshift(time) // 执行:塞进第一项!    return this  }}