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