Parasitic Inheritance

Exploring simpler syntax for parasitic inheritance.

HTML

<h3>Parasitic Inheritance</h3>
<p>As described by <a href="http://www.crockford.com/javascript/inheritance.html">Crockford</a></p>
<p class="notice-me">Enable console for tests</p>
<p>See this <a href="http://stackoverflow.com/questions/18776989/">Stack Overflow Question</a> for more information.

CSS

.notice-me {
    color:red;
    font-weight:bold;
}

JavaScript

function Parasite(host) {
    var self = {};
    self.host = host;
    self.hungry = true;
    
    self.init = function() {
        console.debug('Parasite.init');
        return self;
    };
    
    self.suck = function() {
        console.log("I'm a parasite who sucks on " + self.host);        
        self.hungry = false;
        return self;
    };
    
    self = self.init();
    return self;
}

function Tick(host) {
    var self = new Parasite(host);
    self.engorged = false;

    var base_suck = self.suck;
    self.suck = function() {
        base_suck();
        self.engorge();
    };
    
    self.engorge = function() {
        console.log("And now I'm engorged with blood.");
        self.engorged = true;
    };
    
    self.init = function() {};

    self.init();
    return self;
}

function DeerTick(host) {
    var self = new Tick(host);
    self.victims = 0;

    var base_suck = self.suck;
    self.suck = function() {
        base_suck();
        self.infect();
    };
    
    self.infect = function() {
        console.log("Here have some Lyme disease.");
        self.victims += 1;
    };
    
    self.init = function() {};

    self.init();
    return self;
}

/*
 * Test
 */
function assert_equal(val, expected) {
    if ( val === expected ) {
        console.debug('PASS');
    }
    else {
        console.error('FAIL', ':', val, '!=', expected);
    }
}
 
var parasite = new Parasite('host');
assert_equal(parasite.hungry, true);
parasite.suck();
assert_equal(parasite.hungry, false);

var tick = new Tick('dog');
assert_equal(tick.hungry, true);
assert_equal(tick.engorged, false);
tick.suck();
assert_equal(tick.hungry, false);
assert_equal(tick.engorged, true);
assert_equal(tick.host, 'dog');

var deer_tick = new DeerTick('human');
assert_equal(deer_tick.engorged, false);
assert_equal(deer_tick.victims, 0);
deer_tick.suck();
assert_equal(deer_tick.engorged, true);
assert_equal(deer_tick.victims, 1);