Vererbung in Javascript anhand von Exceptions

Hab noch zwei weitere Artikel gefunden, beide englisch:

Jop, ein weiterer Artikel zu Javascript. Und zur “komischen” Vererbung von Javascript.

Jeder Programmierer kennt Exceptions, diese netten Fehler die einen an den Kopf geschmissen werden, wenn was schief läuft. Auch sowas gibts bei Javascript:

try {
  doSomething();
} catch(e) {
  alert(e.toString());
}

Klassisches try/catch-Statement. Demnächst muss ich nochmal nachschauen wie man “verschiedene” Exceptions erkennt und dann getrennt behandelt. Nunja, weiter gehts, wir bauen uns eine Exception:

throw 42;
throw "I'm a string";
throw {toString: function() { return "I'm an object!"; } };

Alles wunderbar, aber String-Nachrichten schmeissen kann ja jeder. Kommen wir also zu der “BaseException”:

function BaseException(_message) {
	this.name = "BaseException";
	this.message = _message;
}
BaseException.prototype = {
	name : null,
	message : null,
	toString : function() {
		return this.name + ': "' + this.message + '"';
	}
}

Erstmal was ganz simples. Kann man z.B. so schmeissen und fangen:

try {
  throw new BaseException("foobar");
} catch (e) {
  alert(e.toString()); // alerts: "BaseException: foobar"
}

Schön, nicht wahr? Jetzt brauchen wir noch Vererbung:

// ripped from http://www.sitepoint.com/blogs/2006/01/17/javascript-inheritance/ 
function extend(descendant, parent) {
	var sConstructor = parent.toString();
	var aMatch = sConstructor.match(/\s*function (.*)\(/);
	if (aMatch != null) {
		descendant.prototype[aMatch[1]] = parent;
	}
	for (var m in parent.prototype) {
		descendant.prototype[m] = parent.prototype[m];
	}
};

Dies ist wohl leider notwendig. Diese “extend”-Function macht das irgendwie wohl cross-browser-kompatibel. Nunja, für Mozilla-only geht es auch anders. Nunja, “geerbt” wird jetzt so:

function OtherException(_message) {
	// call "super" constructor
	this.BaseException(_message);
	this.name = "OtherException";
}
// OtherException inherits from BaseException
extend(OtherException, BaseException);

Voilà. Fertig ist das Butterbrot:

try {
  throw new BaseException("foobar");
} catch (e) {
  alert(e.toString()); // alerts: "BaseException: foobar"
}
try {
  throw new OtherException("foobar");
} catch (e) {
  alert(e.toString()); // alerts: "OtherException: foobar"
}