lazyman主要原理是:数组
须要一个队列保存将要用到的事件闭包
利用闭包将事件保存至队列中this
建立一个中间件next用来触发事件prototype
链式调用code
使用lazyman须要实现的场景:中间件
LazyMan("Tom"); // my name is Tom! LazyMan("Tom").eat("Pissa"); // my name is Tom! // Eat Pissa ~ LazyMan("Tom").eat("Pissa").sleep(2); // my name is Tom! // Eat Pissa ~ // WakeUp after 2s ! LazyMan("Tom").wekeup(2).eat("Pissa"); // getup after 2s ! // my name is Tom // Eat Pissa
核心代码实现:对象
须要建立一个数组当作队列使用队列
function _LazyMan(name) { // 事件存储队列 this.tasks = []; // 绑定this指向 var _this = this; // 使用闭包 var fn = (function(n) { // 绑定做用域 var name = n; return function(name) { console.log("my name is "+ name); _this.next(); } })(name); this.tasks.push(fn); // 启动任务 setTimeout(function() { _this.next(); }, 0) }
咱们须要一个中间件next用来触发事件事件
_LazyMan.prototype.next = function() { var fn = this.tasks.shift(); fn && fn(); }
完成了触发器、队列存储的位置,下一步只要实现链式调用就能够了。只须要返回this对象自己就能够了。
这里只实现一个wakeup示例作用域
实现链式调用
_LazyMan.prototype.wakeup = function(times) { var _this = this; var fn = (function(time){ return function() { setTimeout(function(){ console.log("getup after "+time+"s !") _this.next(); }, time*1000) } })(times) // 从队列头部插入 _this.tasks.unshift(fn); return this; }
最后一步封装
function LazyMan(name) { return new _LazyMan(name) }
还有一个sleep(), eat()你们能够来试一试。若是有想法的话欢迎提出~ 你们交流一下 O(∩_∩)O