##Tips: #1) Returning `this` from a function of an object instance allows for the method to become chainable. Example: var File = function(){ this.readCallCount = 0; return this; }; File.prototype.readLine = function(){ this.readCallCount++; console.log( "read line: " + this.readCallCount ); return this; }; var fileA = new File(); fileA.readLine().readLine().readLine(); /* output: read line: 1 read line: 2 read line: 3 */ #2) The passed parameters from `deferred.resolve()` are saved until `deferred.resolve()` is invoked again. Therefore the callbacks stored from `deferred.done()` will be passed the same values from the last call from `deferred.resolve()`. Example: var arr = []; function log(str){ return arr.push( str ); } function fn1(time) { return log( "fn1 called at " + time ); } function fn2(time) { return log( "fn2 called at " + time ); } var dfd = $.Deferred(); dfd.done(fn1); dfd.resolve( +(new Date()) ); setTimeout(function(){ dfd.done(fn2); console.log( arr.join( ", " ) ); }, 2000); /* outputs after 2 seconds fn1 called at 1348177948625, fn2 called at 1348177948625 */ Different results can be produced if a function or object is passed to `deferred.resolve()`. Example: var arr = []; function log(str){ return arr.push( str ); } function fn1(getTimeFunc) { return log( "fn1 called at " + getTimeFunc() ); } function fn2( getTimeFunc ) { return log( "fn2 called at " + getTimeFunc() ); } var dfd = $.Deferred(); dfd.done(fn1); dfd.resolve(function(){ return +(new Date()) }); setTimeout(function(){ dfd.done(fn2); console.log( arr.join( ", " ) ); }, 2000); /* output after 2 seconds fn1 called at 1348178107859, fn2 called at 1348178109860 */ ##Final Code: This might work. Instead of extending the deferred object to include a read method, I opted to return an plain object. **Note**: My code is assuming that `libraryCall()` and `fileEntry.getText()` return a `deferred.promise()` or `deferred` object. Code: var FileEntryObj = function(){ this.libraryCallObj = libraryCall(); }; FileEntryObj.prototype.read = function(fn){ this.libraryCallObj.done( function( fileEntry ){ return fileEntry.getText().done( fn ); }); return this; }; var getFileEntry = function(){ return new FileEntryObj(); }; Usage: getFileEntry().read(function (text) { console.log("reading content:" + text); }).read(function (text) { console.log("reading content again: " + text); });