The following is a function which returns the chainable version of a function:
Function.prototype.chain = function() { var me = this; return function() { var ret = me.apply(this, arguments); return ret === undefined ? this : ret; } };
Here is an example of how to define a pseudo-class which uses this chaining method:
function Person(firstName, lastName) { this._firstName = firstName; this._lastName = lastName; } Person.prototype.firstName = (function(firstName) { if(firstName) this._firstName = firstName; else return this._firstName; }).chain(); Person.prototype.lastName = (function(lastName) { if(lastName) this._lastName = lastName; else return this._lastName; }).chain(); Person.prototype.fullName = function() { return this._firstName + " " + this._lastName; };
Here is an example which shows that the chaining works as intended:
// Create my person object as "Kris East" and display this faulty name. var author = new Person("Kris", "East"); alert(author.fullName()); // Prove that first name getter works: Kris alert(author.firstName()); // Fix my name and then display it: Chris West alert(author.lastName("West").firstName("Chris").fullName()); // Prove that last name getter works: West alert(author.lastName());
2 Comments
Framp · August 3, 2013 at 4:33 PM
Am I missing something?
If you replace:
}).chain();
With:
return this; })
You’ll get the same result
JavaScript – Object.prototype.each() | Chris West's Blog · February 27, 2013 at 12:01 AM
[…] functions, if they don’t return anything, they really should return the object itself (snippet to make functions chainable). That is one of the many things John Resig did right in […]