Vererbung in Javascript anhand von Exceptions
Hab noch zwei weitere Artikel gefunden, beide englisch:
- http://www.ruzee.com/blog/2008/12/javascript-inheritance-via-prototypes-and-closures
- http://ejohn.org/blog/simple-javascript-inheritance/
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"
}
Web.de – You’ve got no more mails.
Remote host said: 550 <*@web.de> Benutzer hat das Speichervolumen ueberschritten. / User has exhausted allowed storagespace
Wie ich sowas hasse. Da gibts genau zwei Lösungen:
- Gehe jeden Tag in dein web.de-Postfach und LÖSCHE Zeugs das du nicht brauchst. 12 Megabyte sind nicht viel.
- Gehe zu einem anderen Provider. Bei GMX gibt es 1GB für umsonst, bei Google sogar 7GB. Man kann auch von web.de an das neue Postfach "nachsenden" lassen, dann müsst ihr auch keine neue E-Mail-Adresse an all eure Bekanntschaften verteilen.
Sneak: Lakeview Terrace
Sneak. Film. Lakeview Terrace. Samuel L. Jackson. 7von10. Supi. Feierabend.
Eclipse, Subversion und Spket
Die drei Sachen verwende ich gerade. Da aber irgendwie gerade was abschmiert, steige ich mal auf "unstable" (aka 3.5M3)um:
http://download.eclipse.org/eclipse/downloads/
Eclipse Update URLs:
- Subclipse: http://subclipse.tigris.org/update_1.4.x
- Spket IDE: http://www.spket.com/update
- Subversive
- http://down...rsive/0.7/update-site/ - [required] Subversive plug-in
- http://www.polarion...load/eclipse/2.0/update-site/ - [required] Subversive SVN Connectors
- http://www.polarion...wnload/integrations/update-site/ - [optional] Subversive Integrations
public, private und “privileged” in Javascript
Jetzt wirds hässlich. Natürlich gibts "public" und "private" auch in Javascript. Allerdings, wie immer, ein bisschen anders:
Public
function Constructor(value) {
this.membername = value;
}
Constructor.prototype.membername = value;
myConst = new Constructor("foobar");
print myConst.membername; // prints 'foobar'
Private
function Constructor(value) {
var self = this;
this.membername1 = value; // public member
var membername2 = value + "private"; // private member
function membername() { // private method
print self.member; //access to public member in private method
print membername2; // access to private member in private method
}
}
myConst = new Constructor("foobar");
print myConst.membername1; // prints 'foobar'
print myConst.membername2; // prints 'undefined'
myConst.membername(); //no such function
Wenn man jetzt aber z.B. mittels dem property "prototype" auf private-members zugreifen will, dann wird man scheitern. "public" hat keinen Zugriff auf "private". Dazu muss man die "privileged"-Methoden verwenden.
Privileged
function Constructor(value) {
this.membername = function membername() {
print "hi";
};
}
myConst = new Constructor("foobar");
myConst.membername(); // prints "hi"