Creación avanzada de clases
Actualización: noviembre 2007
Cuando se define una clase de JScript, se pueden asignar propiedades y, posteriormente, la clase definida puede heredar de otras clases. Las propiedades, que son miembros de clase similares a los campos, proporcionan un mayor control sobre la forma en que se obtiene acceso a los datos. Mediante la herencia, las clases se pueden extender (o bien agregar comportamiento a) otras clases.
Una clase se puede definir de manera que sus instancias admitan las propiedades expando. Esto significa que a los objetos basados en clases se les pueden agregar propiedades y métodos dinámicamente. Los objetos expando basados en clases proporcionan parte de la funcionalidad de los objetos basados en prototipos.
Clases con propiedades
JScript usa las instrucciones function get y function set para especificar las propiedades. Se puede especificar cualquiera de los descriptores de acceso, o ambos, para crear propiedades de sólo lectura, de sólo escritura o de lectura y escritura, si bien las propiedades de sólo escritura son poco frecuentes y pueden indicar que hay algún problema de diseño en la clase.
El programa de llamada obtiene acceso a las propiedades de la misma manera que a los campos. La diferencia principal consiste en que se utilizan el método captador y establecedor de la propiedad para realizar el acceso, mientras que a los campos se obtiene acceso directamente. Una propiedad permite que la clase compruebe que sólo se escribe información válida, haga un seguimiento del número de veces que se lee o establece la propiedad, devuelva información dinámica, etc.
Normalmente, las propiedades se usan para obtener acceso a los campos privados o protegidos de la clase. Los campos privados se marcan con el modificador private y sólo pueden tener acceso a ellos los otros miembros de la clase. Los campos protegidos se marcan con el modificador protected y sólo pueden tener acceso a ellos los otros miembros de la clase o de clases derivadas. Para obtener más información, vea Modificadores de JScript.
En este ejemplo, se usan las propiedades para obtener acceso a un campo protegido. El campo está protegido para ayudar a impedir que código externo cambie su valor al permitir que clases derivadas tengan acceso a él.
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());
El resultado de este código es:
Fred says 'Hello!'
Si se asigna un nombre en blanco a la propiedad Name, se genera un error.
Herencia de clases
La palabra clave extends se utiliza al definir una clase que se genera a partir de otra. JScript puede extender la mayor parte de las clases compatibles con CLS (Common Language Especification). Una clase definida con la palabra clave extends se conoce como clase derivada, y la clase que se extiende se conoce como clase base.
En este ejemplo se define una nueva clase Student, que extiende la clase Person del ejemplo anterior. La clase Student vuelve a utilizar la propiedad Name definida en la clase base, pero define un nuevo método sayHello que reemplaza el método sayHello de la clase base.
// 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());
El resultado de este código es:
Mary is studying for finals.
Al volver a definir un método en una clase derivada, no cambia el método correspondiente en la clase base.
Objetos Expando
Si desea que un objeto genérico sea expando, use el constructor Object.
// 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.
Si desea que una de las clases sea expando, defina la clase con el modificador expando. A los miembros expando sólo se puede tener acceso mediante la notación de índice ([]) y no con la notación de punto (.).
// 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();
El resultado de este programa es:
The contents of e are...
answer = 42
greeting = hello
new year = Sat Jan 1 00:00:00 PST 2000