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