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
以此类推。
复制代码
代码
function LazyMan(name){
return new _LazyMan(name)
}
class _LazyMan {
constructor(name){
this.name = name
this.tasks = []
this.task = (name => {
console.log('add task')
return () => {
console.log(`Hi! This is ${name}!`)
this.next()
}
})(name)
this.tasks.push(this.task)
// 等待 所有事件 入队(tasks)
setTimeout(() => {
console.log('第一次调用')
this.next()
}, 0);
}
eat(food) {
console.log('add eat')
const _eat = (food => {
return () => {
console.log(`Eat ${food}~`)
this.next()
}
})(food)
this.tasks.push(_eat)
return this
}
sleep(time) {
console.log("add sleep");
const _sleep = (time => {
return () => {
setTimeout(() => {
console.log(`Wake up after ${time}`)
this.next()
}, time);
}
})(time)
this.tasks.push(_sleep)
return this
}
// 放入队首
sleepFirst(time) {
console.log("add sleepFirst");
const _sleepFirst = (time => {
return () => {
setTimeout(() => {
console.log(`Wake up after ${time}`)
this.next()
}, time);
}
})(time)
this.tasks.unshift(_sleepFirst)
return this
}
next(){
const task = this.tasks.shift()
task && task()
}
}
LazyMan('Hank').sleep(10).eat('dinner').sleepFirst(50)
复制代码
深拷贝
function deepClone(obj){
function isObject(o){
return (typeof o === 'object' || typeof o === 'function') && o != null
}
if(!isObject(obj)) throw new Error('参数不是对象')
let isArray = Array.isArray(obj)
let newObj = isArray ? [...obj] : {...obj}
//console.log(Reflect.ownKeys(obj))
Reflect.ownKeys(newObj).forEach(key => {
newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
})
return newObj
}
复制代码