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;
}