 <p>There's a better way.</p> <p>jQuery documentation for <a href="https://api.jquery.com/deferred.promise/" rel="nofollow">Deferred.promise([target])</a> says :</p> <blockquote> <p>If target is provided, <code>deferred.promise()</code> will attach the methods onto it and then return this object rather than create a new one. This can be useful to attach the Promise behavior to an object that already exists.</p> </blockquote> <p>Thus, you can define your own promise methods as follows :</p> <pre><code>var myPromiseMethods = { myMethod1: function() { ... }, myMethod2: function() { ... }, myMethod3: function() { ... } }; </code></pre> <p>Then, you can make your methods available as follows :</p> <pre><code>var dfrd = $.Deferred(); ... return dfrd.promise(myPromiseMethods).myMethod(); </code></pre> <p>In general, you will want to write your methods something like this :</p> <pre><code>myMethod1: function() { var promise = this; //do something awesome here return promise; } </code></pre> <p>By returning <code>this</code> or <code>promise</code>, the method becomes chainable like the built-in Promise methods, eg :</p> <pre><code>var dfrd = $.Deferred(); ... return dfrd.promise(myPromiseMethods).myMethod().then(...); </code></pre> <h2>Example</h2> <p>You can define the object containing the custom method in any convenient scope. In this example, I simply name the object <code>é</code> (altGreen-E under Windows), which is compact, distinctive and unlikely to be used for other purposes. </p> <p>So let's define an <code>invert()</code> method which reverses the sense of a promise - resolve becomes reject and reject becomes resolve.</p> <pre><code>var é = { invert: function() { var promise = this; return $.Deferred(function(dfrd) { promise.then(dfrd.reject, dfrd.resolve); }).promise(); } }; var dfrd = $.Deferred(); dfrd.promise(é).invert().done(function(str) { alert('done: ' + str); }).fail(function(str) { alert('fail: ' + str); }); dfrd.reject('*'); </code></pre> <p>As you can see, the methods defined in <code>é</code> become available to any promise created with <code>dfrd.promise(é)</code>. </p> <p><strong><a href="http://jsfiddle.net/R8Evv/" rel="nofollow">DEMO</a></strong></p>