LazyMan
最近遇到的一到面试题,时间限制没完整答出来,回去之后写出来发现实现的不够优雅
题目:
实现一个LazyMan,可以按照一下方式调用:
- LazyMan("Hank")输出:
Hi! This is Hank!
- LazyMan("Hank").sleep(10).eat("dinner")输出
Hi! This is Hank!
// 等待10秒...
Wake up after 10
Eat dinner~
- LazyMan("Hank").eat("dinner").eat("supper")输出
Hi This is Hank!
Eat dinner~
Eat supper~
- LazyMan("Hank").sleepFirst(5).eat("supper")输出
// 等待5秒
Wake up after 5
Hi This is Hank!
Eat supper~
以此类推.
题目分析:
- 实现一个打印名字的方法
- 实现sleep、eat、sleepFirst方法
- 实现链式调用,实现的方法应该返回this
- sleepFirst方法可以插队
实现代码
let index = 0 // 当前执行任务的下标
let stack = [] // 任务队列
function next () { // 执行下一个任务
let fn = stack[index]
index++
if (typeof fn === 'function') {
fn()
}
}
function Man (name) {
stack.push(function () {
console.log(`Hi This is ${name}!`)
next();
})
}
var LazyMan = function (name) {
return new Man(name)
}
// 定义sleep函数
Man.prototype.sleep = function (time) {
stack.push(function () {
setTimeout(function () {
console.log(`Wake up after ${time}`)
next()
}, time *1000)
})
return this
}
// 定义eat函数
Man.prototype.eat = function (food) {
stack.push(function () {
console.log(`Eat ${food}~`)
next()
})
return this
}
// 定义sleepFirst函数
Man.prototype.sleepFirst = function (time) {
// 实现插队
stack.unshift(function () {
setTimeout(function () {
console.log('wake up after '+ time + '秒')
next()
}, time *1000)
})
return this;
}
LazyMan("Hank")
// 输出:
// Hi! This is Hank!
LazyMan("Hank").sleep(10).eat("dinner")
// 输出:
// Hi! This is Hank!
// 等待10秒...
// Wake up after 10
// Eat dinner~
LazyMan("Hank").eat("dinner").eat("supper")
// 输出:
// Hi This is Hank!
// Eat dinner~
// Eat supper~
LazyMan("Hank").sleepFirst(5).eat("supper")
// 输出:
// // 等待5秒
// Wake up after 5
// Hi This is Hank!
// Eat supper~
next()
感觉我的实现还是用了很多代码,不知道你有没有更简单的实现方式。欢迎分享!