直接上代码
思路:将执行函数放入数组队列,使用next() 执行,将调用函数赋值给构造函数的原型,可以进行连续链式调用,必要:执行功能函数需要返回this
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 Person = function (name) {
return new Man(name)
}
Man.prototype.sleep = function (time) {
stack.push(function () {
setTimeout(function () {
console.log("Wake up after " + time)
next()
}, time * 1000)
})
return this;
}
Man.prototype.eat = function (food) {
stack.push(function () {
console.log('Eat ' + food)
next();
})
return this;
}
Man.prototype.sleepFirst = function (time) {
stack.unshift(function () {
setTimeout(function () {
console.log('wake up after ' + time)
next()
}, time * 1000)
})
return this;
}
// Person('Li')
/* 输出:
Hi! This is Hank!
*/
// Person('Dan').sleep(3).eat('dinner')
/* 输出:
Hi! This is Hank!
// 等待10秒..
Wake up after 10
Eat dinner~
*/
// Person('Jerry').eat('dinner~').eat('supper~')
/* 输出:
Hi This is Hank!
Eat dinner~
Eat supper~
*/
Person('Smith').sleepFirst(2).eat('supper')
/* 等待5秒,输出
Wake up after 5
Hi This is Hank!
Eat supper
*/
next()