My Javascript Object maker
While using my solution to clear, easy to understand and short asynchronous Javascript, I ran into a big problem. I wrote it properly(1), with private variables and all. But, if another part of code called it, the variables would collide. It was just a function. Obvious in retrospect, like most problems!
I need an instance of the function for each call. But, I really don’t like “objects.” I’m not sure why. So, I decided to write an “Object Maker” that will accept a function as an input.
Here it is:
PX.asyncObject = function (spec, my) {
var that = {}; // declare PRIVATE variables here
my = my || {}; // Use my.xx for *shared* variables
if (spec.objName) {
eval('var ' + spec.objName); // GLOBAL vars are *more* evil than eval
window[spec.objName] = spec.newObj; // Make the function sent into a method named from objName
that[spec.objName] = window[spec.objName]; // Make the new method a method of "that"
} else {
var go;
go = spec.newObj; // Make the function into a method named "go"
that.go = go; // Make "go" a method of "that"
}
that.spec = spec; // Put spec into private vars. call go({vars})
return that; // return the new, private, durable object
};
The basic routine and idea came from (surprise) Douglas Crockford’s “Javascript: The Good Parts,” pp. 52-55. It is called a functional constructor.
I use it like this:
PX.asyncObject({
newObj: function (spec) {
PX.Rest('GET', sUrl, undefined,
function (result, o) {
if (result) {
// Code for success
} else {
// Code for failure
}
// Code for both
}
);
}
}).go();
Four lines longer and only a little less readable.
(1) Using a Module (pp. 40-41) from Douglas Crockfords “Javascript: The Good Parts.”
1 comment so far
Leave a reply
any chance of an actual live demo?