Javascript functional inheritance pattern

by vtortola

JavaScript

var human = function(){
    var me = {};
    var _isAlive = true;
    Object.defineProperty(me, "isAlive", {
        get: function() { return _isAlive}
    });
    
    me.say=function(what){
        if(_isAlive)
          alert(what+'!');  
        else
           throw new Error('I am dead!');                
    }
    me.die=function(){
      _isAlive = false;                
    }
    return me;
};

var person = function(){
    var me = human();
    return me;
};        
                          
var ninja = function(){
    var me = human();
    me.say = function(what){
        if(me.isAlive)
          alert(what+', I am a ninja!');  
        else
           throw new Error('I am dead!');          
    };
    return me;
};
var myPerson = person();
myPerson.say('hi');

var myNinja = ninja();
myNinja.say('hello');
alert('Ninja Alive: ' +myNinja.isAlive);
myNinja.die();
alert('Ninja Alive: ' +myNinja.isAlive);

try{
    myNinja.say('hello');
}catch(err){
    alert('Error: ' + err.message);
}