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 […]