一道阿里的面试题

97 阅读1分钟

直接上菜吧

 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也能实现,后边两个就很牵强了。