直接上菜吧
1. EatMan('Hank')输出:
Hi! This is Hank!
2. EatMan('Hank').eat('dinner').eat('supper')输出
Hi! This is Hank!
Eat dinner~
Eat supper~
3. EatMan('Hank').eat('dinner').eatFirst('lunch')输出
Eat lunch~
Hi! This is Hank!
Eat dinner~
4. EatMan('Hank').eat('dinner').eatFirst('lunch').eatFirst('breakfast')输出
Eat breakfast~
Eat lunch~
Hi! This is Hank!
Eat dinner~
分析:
第一眼看过来,感觉这道题考核的是promise或者class
前两个先用class实现,class要比promise简单。返回当前实例就可一直无限调用,相信大多数小伙伴都是这样写吧
class EatManClass{
constructor (name){
this.sayHi(name)
}
sayHi(name){
console.log(`Hi! This is ${name}!`)
}
eat(name){
console.log(`eat ${name}!`)
return this
}
}
function EatMan(name){
return new EatManClass(name)
}
后边的两个如果按照上边的写法,显然就不行了。可以利用setTimeout的延迟,每调用一次就把事件加入队列数组,。最后在延时器中逐条执行
class EatManClass{
constructor (name){
this.eventList=[]
this.sayHi(name)
setTimeout(()=>{
this.eventList.forEach(event=>{
event()
})
this.eventList=[]
},0)
}
sayHi(name){
let fn=()=>{
console.log(`Hi! This is ${name}!`)
}
this.eventList.push(fn)
}
eat(name){
let fn=()=>{
console.log(`eat ${name}!`)
}
this.eventList.push(fn)
return this
}
eatFirst(name){
let fn=()=>{
console.log(`eat ${name} first!`)
}
this.eventList.unshift(fn)
return this
}
}
前边两个用promise也能实现,后边两个就很牵强了。