Object inheritance using Object.create() without a constructor function.

Just a quick example of creating an Object inheritance chain using prototype and Object.create() without constructor function (using init()).

by sym3tri

HTML

<script src="http://underscorejs.org/underscore-min.js"></script>
<div id="result"></div>

JavaScript

var Exception,
  UndefinedReferenceException;

function format(formatString) {
  var args = _.toArray(arguments),
    substitutions = _.rest(args, 1),
    result = _.clone(formatString);

  _.each(substitutions, function (substitution, idx) {
    result = result.replace(new RegExp('\\{' + idx + '\\}', 'g'),
    substitutions[idx]);
  });

  return result;
}

Exception = {
  'name': 'Exception',
  'message': 'An unknown exception occurred.',
  toString: function () {
      return format('{0}: {1}', this.name, this.message);
  }
};
    
UndefinedReferenceException = Object.create(Exception, 
    {
    'name': {
      value: 'UndefinedReferenceException' 
    },
    'message': {
      value: 'The value of [{0}] is undefined.' 
    },
    'init': { value: function () {
        var args = _.toArray(arguments),
              formatArgs;   
        if (arguments.length) {
            formatArgs = [this.message].concat(args);
            this.message = format.apply(format, formatArgs)
        }
        return this;
    }}
});

// alternate syntax of above
/*
UndefinedReferenceException = Object.create(Exception, 
    {
    'name': {
      value: 'UndefinedReferenceException' 
    },
    'message': {
      value: 'The value of [{0}] is undefined.' 
    }
});

_.extend(UndefinedReferenceException, {
    init: function () {
        var args = _.toArray(arguments),
              formatArgs;   
        if (arguments.length) {
            formatArgs = [this.message].concat(args);
            this.message = format.apply(format, formatArgs)
        }
        return this;
    }
});
*/
        
// alternate implementation
/*
var ExceptionFactory = function (type) {
    return Object.create(type).init(_.rest(_.toArray(arguments), 1));
}
*/
    
jQuery(function () {
    try {
        // ANY OF THESE WILL WORK
    
        // throw Exception
        throw Object.create(UndefinedReferenceException).init('foobar');
        // throw ExceptionFactory(UndefinedReferenceException, 'factory...