Crockford Functional inheritance
From the Good Pars, p.116
by BrownieBoy
HTML
<input type="button" onclick="doAction();" value="doAction()"><br>
<br>
<br>
<input name="TestField" value="" id="TestField"></form>
JavaScript
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
Object.method('superior', function (name) {
var that = this,
method = that[name];
return function ( ) {
return method.apply(that, arguments);
};
});
var mammal = function(spec) {
var that = {};
that.get_name = function() {
return spec.name;
};
that.says = function() {
return spec.saying || '';
};
return that;
};
var cat = function(spec) {
spec.saying = spec.saying || 'meow';
var that = mammal(spec);
that.purr = function(n) {
var i, s = '';
for (i = 0; i < n; i += 1) {
if (s) {
s += '-';
}
s += 'r';
}
return s;
};
that.get_name = function() {
return that.says() + ' ' + spec.name + ' ' + that.says();
}
return that;
};
var coolcat = function (spec) {
var that = cat(spec),
super_get_name = that.superior('get_name');
that.get_name = function (n) {
return 'like ' + super_get_name( ) + ' baby';
};
return that;
};
function doAction() {
var myCat = cat({
name: 'Henrietta'
});
console.log('myCat.get_name() = ' + myCat.get_name());
var myCoolCat = coolcat({name: 'Bix'});
var name = myCoolCat.get_name();
console.log('name = ' + name);
// 'like meow Bix meow baby'
mammal.get_name = function() {
return "mammal method overwritten";
};
console.log("mammal.get_name() = " + mammal.get_name());
console.log("myCoolCat.get_name() = " + myCoolCat.get_name());
var x = 1;
}