Eigenschaften die generell für eine ganze Klasse gelten sollten also im Prototypen der Klasse definiert werden. OK, aber was ist der Sinn des Code-Blocks der beim Erstellen einer Instanz durchlaufen wird? Im vorigen Beispiel haben wir diese Blöcke benutzt um Werte einer Instanz zuzuweisen, jedoch waren diese konstant und somit für alle Instanzen gleich. Wenn sie für alle Instanzen gleich sind, dann gehören sie wahrscheinlich zur Klasse, daher wurden "beine" ja auch im Prototypen definiert. Wenn wir aber nur konstante Werte innerhalb dieses Code-blocks zuweisen können, hätte dieser einen sehr limitierten Nutzen. Glücklicherweise können wir dem Konstruktor beliebige Parameter (=Argumente) übergeben. Das folgende Beispiel mag wie eine normale Funktion aussehen, allerdings stellt sie einen Konstruktor dar welcher verschiedene Parameter unterstützt:
Dog
= function( age, hair )
{
this.age = age;
this.hair = hair;
}
Dog.prototype.legs = 4;
rover
= new Dog( 6, "shaggy" );
fido = new Dog( 4, "puffy" );
yeller = new Dog( 12, "gray" );
Ein paar Dinge sind hier erwähnenswert. Als erstes beachten Sie die Namen der Argumente, sie sind diesselben wie die Eigenschaftsnamen der Instanz (this.age = age). Möglicherweise haben Sie das Bedürfnis solche Namenskonflikte zu vermeiden, vielleicht wäre es besser die Argumente z.B. "passedAge" und "passedHair" zu nennen. Wenn wir das ganze jedoch genauer betrachten werden wir feststellen, dass dies nicht notwendig ist. Während this.age auf die Eigenschaft der Instanz zeigt, bezieht sich "age" auf das Argument. Benutzt man einen Variablennamen ohne "this." bezieht es sich immer auf den Namespace des Konstruktors, nicht auf die Instanz! Der Code "var age = 6" würde den Parameter des Konstruktors überschreiben, jedoch die Instanzvariable this.age unverändert lassen. Es ist wichtig, dass Sie diese Namespaces genau trennen können!
Der zweite wichtige Aspekt ist, Argumente werden nur anhand ihrer Position identifiziert. Wenn Sie also der Klasse Dog die beiden Werte "hair" und "age" (in genau dieser Reihenfolge beim Erstellen der Instanz mit new!) übergeben, wird die Reihenfolge nicht geändert, selbst wenn Sie eine andere Reihenfolge verwenden. Das Argument age wird immer als erster Wert übergeben und das Argument hair immer als zweites. - Der Grund hierfür ist die Deklaration der Klasse, welche Vorrang hat. Hier ist ein Beispiel der auf einem alten Herman Cartoon basiert:
marylin
= new Date(36,22,35);
bridgette = new Date(38,23,36);
herman = new BlindDate(42,18,37);
wenn Sie sich die Klassen ansehen:
function Date(
bust, waist, hips )
{
this.bust = bust;
this.waist = waist;
this.hips = hips;
}
soweit so gut ...
function BlindDate(
age, IQ, shoeSize )
{
// uh ohhh...
this.age = age;
this.IQ = IQ;
this.shoeSize = shoeSize;
}
... es ist klar, dass die Klassen nur die Werte erhalten, und nur die Klasse entscheidet über die Bedeutung der einzelnen Werte!
Der letzte wichtige Punkt ist, Argumente werden immer nach ihrem Wert übergeben, das heißt wenn Sie die Variable "arg" übergeben, und arg gleich 2 ist, dann übergeben Sie 2. Natürlich, wenn arg auf ein Objekt referenziert, wird nur die Referenz auf dieses Objekt übergeben, sodass Änderungen im Objekt auf das Originalobjekt durchgeführt werden. - Der springende Punkt jedoch ist, dass nicht der Name "arg" zählt, sondern nur der Wert von arg. Sehen Sie sich den folgenden (nicht sehr OO-mäßigen) Code an:
function
test(arg1, arg2){ arg1 = "changed"; arg2.prop2 = 6;}
arg1 = "original";
arg2 = { prop1:5 }
test( arg1, arg2 );
trace( arg1 ); // "original" - did not change
trace( arg2.prop2 ); // 6 - did change
Die Funktion wird nur den Wert erhalten. Natürlich wussten Sie das wahrscheinlich schon und verstehen es nach dieser Erklärung natürlich immer noch. Das ist gut, weil dies für Klassen zutrifft, sowie für Methoden, auf welche wir kurz eingehen werden.
Um kurz zusammenzufassen: Die Instanz welche die Klasse aufruft sollte die Klasse auf die gewünschten Argumente hin überprüfen sowie die Reihenfolge der erwünschten Argumente einhalten. Argumente werden als Wert übergeben (pass by value). Wir werden auf Argumente später noch genauer eingehen.