function makeClass(proto){
var f = proto.init;
f.prototype = proto;
return f;
}
Person = makeClass({
init:function(name){
this.name = name
},
alert:function(){
alert(this.name)
}
})
Joe = new Person(4);
Joe.alert();
Interessant, wie man mit etwas Meta-Code die Funktionsweise von JavaScript verdunkeln kann. Aus Interesse: Wozu braucht man diese Helferfunktion? Ist es unverständlicher oder mehr Schreibarbeit, Konstruktoren und Prototypen ganz konventionell zu notieren:
~~~javascript
function Person (name) {
this.name = name;
}
Person.prototype = {
alert : function () {
alert(this.name);
}
};
var joe = new Person('Joe');
joe.alert();
Ich find es eher verwirrend, dass die init-Methode gleichzeitig der Konstruktor ist, an dem dann auch das prototypische Objekt hängt. Das widerspricht dem Verhalten von sämtlichen Umsetzungen von »Pseudoklassen« (aus Mootools, Prototype usw.). Also wenn ich Pseudoklassen will, dann würde ich eher eine dieser verwenden. Eine Helferfunktion »makeClass« zu nennen, die lediglich eine kompaktere Schreibweise des Konstruktors als Eintrag eines Object-Literals erlaubt, vereinfacht die Sache m.M.n. nicht.
Instanzen können nur über »init« auf ihren Konstruktor zugreifen - was nicht über das standardmäßige »constructor« möglich ist, weil der Prototyp hier komplett überschrieben wird. Das finde ich ebenfalls verwirrend.
Mathias