Erweiterte Klassenerstellung
Aktualisiert: November 2007
Wenn Sie eine JScript-Klasse definieren, können Sie Eigenschaften zuweisen, und die definierte Klasse kann anschließend von den anderen Klassen erben. Eigenschaften sind Klassenmember, die Feldern ähneln, und bieten mehr Steuerungsmöglichkeiten dafür, wie auf Daten zugegriffen wird. Durch Vererbung kann eine Klasse eine andere Klasse erweitern (oder ihr weiteres Verhalten hinzufügen).
Sie können eine Klasse so definieren, dass Instanzen der Klasse expando-Eigenschaften unterstützen. Dies bedeutet, dass klassenbasierte Objekte dem Objekt dynamisch Eigenschaften und Methoden hinzufügen können. Klassenbasierte expando-Objekte bieten etwa die gleichen Funktionen wie prototypbasierte Objekte.
Klassen mit Eigenschaften
In JScript werden Eigenschaften anhand der function get-Anweisung und der function set-Anweisung angegeben. Sie können einen oder beide Accessoren angeben, um schreibgeschützte oder lesegeschützte Eigenschaften oder Eigenschaften mit Lese-/Schreibzugriff zu erstellen. Lesegeschützte Eigenschaften sind jedoch eher selten und können auf ein Problem im Entwurf der Klasse hinweisen.
Das aufrufende Programm greift auf Eigenschaften genau so wie auf Felder zu. Der Hauptunterschied liegt darin, dass der get-Accessor und der set-Accessor für die Eigenschaft für den Zugriff verwendet werden, während auf Felder direkt zugegriffen wird. Mithilfe einer Eigenschaft kann die Klasse sicherstellen, dass nur gültige Informationen eingegeben werden, aufzeichnen, wie oft die Eigenschaft gelesen oder gesetzt wird, dynamische Daten zurückgeben usw.
Eigenschaften werden in der Regel für den Zugriff auf private oder geschützte Felder der Klasse verwendet. Private Felder sind mit dem private-Modifizierer gekennzeichnet, und nur andere Member der Klasse können darauf zugreifen. Geschützte Felder sind mit dem protected-Modifizierer gekennzeichnet, und nur andere Member der Klasse oder abgeleiteter Klassen können darauf zugreifen. Weitere Informationen finden Sie unter JScript-Modifizierer.
Im folgenden Beispiel wird mithilfe von Eigenschaften auf ein geschütztes Feld zugegriffen. Das Feld ist geschützt, um zu verhindern, dass externer Code seinen Wert ändert, während abgeleitete Klassen dennoch darauf zugreifen können.
class Person {
// The name of a person.
// It is protected so derived classes can access it.
protected var name : String;
// Define a getter for the property.
function get Name() : String {
return this.name;
}
// Define a setter for the property which makes sure that
// a blank name is never stored in the name field.
function set Name(newName : String) {
if (newName == "")
throw "You can't have a blank name!";
this.name = newName;
}
function sayHello() {
return this.name + " says 'Hello!'";
}
}
// Create an object and store the name Fred.
var fred : Person = new Person();
fred.Name = "Fred";
print(fred.sayHello());
Ausgabe dieses Codes:
Fred says 'Hello!'
Wird der Name-Eigenschaft ein leerer Name zugewiesen, dann wird ein Fehler ausgelöst.
Vererbung aus Klassen
Das extends-Schlüsselwort wird beim Definieren einer Klasse verwendet, die auf einer anderen Klasse aufbaut. JScript kann die meisten CLS (Common Language Specification-)kompatiblen Klassen erweitern. Eine Klasse, die mit dem extends-Schlüsselwort definiert wurde, wird als abgeleitete Klasse bezeichnet. Die Klasse, die durch die abgeleitete Klasse erweitert wird, ist die so genannte Basisklasse.
Im folgenden Beispiel wird eine neue Student-Klasse definiert, die die Person-Klasse aus dem vorigen Beispiel erweitert. Die Student-Klasse verwendet die Name-Eigenschaft wieder, die in der Basisklasse definiert ist, definiert jedoch auch die neue sayHello-Methode, die die sayHello-Methode der Basisklasse überschreibt.
// The Person class is defined in the code above.
class Student extends Person {
// Override a base-class method.
function sayHello() {
return this.name + " is studying for finals.";
}
}
var mary : Person = new Student;
mary.Name = "Mary";
print(mary.sayHello());
Ausgabe dieses Codes:
Mary is studying for finals.
Durch Umdefinieren einer Methode in einer abgeleiteten Klasse wird die entsprechende Methode in der Basisklasse nicht verändert.
Expando-Objekte
Wenn nur ein generisches Objekt ein expando-Objekt sein soll, verwenden Sie den Object-Konstruktor.
// A JScript Object object, which is expando.
var o = new Object();
o.expando = "This is an expando property.";
print(o.expando); // Prints This is an expando property.
Wenn eine der Klassen expando sein soll, definieren Sie die Klasse mit dem expando-Modifizierer. Auf Expando-Member kann nur mit der Indexnotation ([]) zugegriffen werden, nicht mit der Punktnotation (.).
// An expando class.
expando class MyExpandoClass {
function dump() {
// print all the expando properties
for (var x : String in this)
print(x + " = " + this[x]);
}
}
// Create an instance of the object and add some expando properties.
var e : MyExpandoClass = new MyExpandoClass();
e["answer"] = 42;
e["greeting"] = "hello";
e["new year"] = new Date(2000,0,1);
print("The contents of e are...");
// Display all the expando properites.
e.dump();
Ausgabe dieses Programms:
The contents of e are...
answer = 42
greeting = hello
new year = Sat Jan 1 00:00:00 PST 2000