 <p>Thanks to advice, I made it! Here is the code.</p> <pre><code>var foo = function(){}; foo.prototype = { say : function(s){ Queue.enqueue(function(){ alert(s); }); Queue.flush(); return this; }, delay : function(ms){ Queue.enqueue('delay:' + ms); return this; } } Queue = { entries : [], inprocess : null, enqueue : function(entry){ Queue.entries.push(entry); }, flush : function(){ if(Queue.inprocess) return; while (Queue.entries.length){ var entry = Queue.entries.shift(); if(entry.toString().indexOf('delay:') !== -1){ var ms = Number(entry.split(':')[1]); Queue.inprocess = setTimeout(function(){ Queue.inprocess = null; Queue.flush(); }, ms); return; } entry(); } } } </code></pre> <p>I prepared a Queue object to manage functions' entries. With this, I can play with a method-chain:</p> <pre><code>var bar = new foo(); bar.delay(2000).say('Hello, ').delay(3000).say('world!'); </code></pre> <p>Many thanks!</p>