In Douglas Crockford’s JavaScript: The Good Parts he recommends that we use functional inheritance. Here’s an example:
var mammal = function(spec, my) {
var that = {};
my = my || {};
// Protected
my.clearThroat = function() {
return "Ahem";
};
that.getName = function() {
return spec.name;
};
that.says = function() {
return my.clearThroat() + ' ' + spec.saying || '';
};
return that;
};
var cat = function(spec, my) {
var that = {};
my = my || {};
spec.saying = spec.saying || 'meow';
that = mammal(spec, my);
that.purr = function() {
return my.clearThroat() + " purr";
};
that.getName = function() {
return that.says() + ' ' + spec.name + ' ' + that.says();
};
return that;
};
var kitty = cat({name: "Fluffy"});
The main issue I have with this is that every time I make a mammal or cat the JavaScript interpreter has to re-compile all the functions in it. That is, you don’t get to share the code between instances.
My question is: how do I make this code more efficient? For example, if I was making thousands of cat objects, what is the best way to modify this pattern to take advantage of the prototype object?
Well, you just can’t do it that way if you plan on making lots of
mammalorcat. Instead do it the old fashioned way (prototype) and inherit by property. You can still do the constructors the way you have above but instead ofthatandmyyou use the implicitthisand some variable representing the base class (in this example,this.mammal).I’d use another name than
myfor base access and store it inthisin thecatconstructor. In this example I usedmammalbut this might not be the best if you want to have static access to the globalmammalobject. Another option is to name the variablebase.