/xia栽ke:52xueit.com/585/
“旧游如梦,重逢却是初见”,这句话很好的描述了再看见这个面试题的感觉,最开始知道这道题的时候,它只是道题,再看见时,它好像变成了很多知识点,这也是一种进步的吧。 题目 可能有些人不知道这道题目,所以有必要描述一下题目,这是一道经典题目 js复制代码> LazyMan('Hank') 你好,我是 Hank > LazyMan('Hank').sleep(10).eat('lunch') 你好,我是 Hank (等10秒...) 我醒了,我刚睡了 10 秒 吃午餐 > LazyMan('Hank').eat('lunch').eat('supper') 你好,我是 Hank 吃午餐 吃晚餐 > LazyMan('Hank').sleepFirst(5).eat('supper') (沉默5秒) 我醒了,我刚刚睡了 5 秒 你好,我是 Hank 吃晚餐
需要实现 LazayMan 函数,函数接收一个参数
实现链式调用
实现sleep, eat, sleepFirst方法,且执行时机要与上述匹配
知道上述情况后,大致可以奠定LazyMan的基调
js复制代码const LazyMan = (name) => { return { sleep(){}, eat(){}, sleepFirst(){} } } LazyMan("Hank")
清楚题目后,我们开始来实现吧,如果可以,我建议你可以自己先想一想!
实现 LazyMan('Hank')
从这里第一个打印来看,非常简单,只需要将这个参数值在控制台打印出即可
代码实现
js复制代码const LazyMan = (name) => { console.log(你好,我是${name}) return { sleep(){}, eat(){}, sleepFirst(){} } } LazyMan("Hank")
这样就可以得到第一个打印结果:
第一步实现非常简单,对吧,接下来继续实现下一个
实现sleep(10)和eat('lunch')
首先看到LazyMan('Hank').sleep(10).eat('lunch')打印结果
js复制代码你好,我是 Hank (等10秒...) 我醒了,我刚睡了 10 秒 吃午餐
sleep函数的执行时机是按照链式调用顺序执行,且sleep的作用是等待n秒后,再执行后续调用
eat函数就是根据参数打印是吃午餐,还是吃晚餐还是... 清楚这些后,我们开始在原来的代码上添加修改代码,以达到目的,既然 sleep 是等待n秒后执行其他函数,那我直接死循环等待即可
代码实现:
js复制代码const LazyMan = (name) => { console.log(你好,我是${name}) const lazyMan = { sleep(second){ let startTime = Date.now() while (Date.now() - startTime < 10000) { } // 空等 second 秒 console.log(我醒了,刚刚睡了${second}秒) return lazyMan // 链式调用 }, eat(type){ console.log("吃午餐") }, sleepFirst(){} } return lazyMan } LazyMan("Hank").sleep(10).eat("lunch")
完工,这样我们也达到了这个调用的打印顺序要求了,查看结果:
接下来继续实现下一个
实现eat函数
我们先看到调用方式LazyMan('Hank').eat('lunch').eat('supper'),在看打印结果