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...