Visit Mozilla.org

Guía JavaScript 1.5:Crear nuevos objetos:Definiendo las funciones get y set

De MDC

[editar] Definiendo Obtenedores y Modificadores

Un obtenedor [getter] es un método que obtiene el valor de una propiedad específica. Un modificador [setter] es un método que configura o modifica el valor de una propiedad específica. Puede definir obtenedores y modificadores de cualquier núcleo de un objeto definido o de un definido objeto de usuario que soporte la adición de nuevas propiedades. La sintaxis para la definción de un obtenedor y un modificador utiliza la sintaxis literal de un objeto.

La siguiente sesión del shell de JS ilustra como los obtenedores y modificadores podrían trabajar para un definido objeto de usuario "o". El shell de JS es una aplicación que permite a los desarrolladores el testear o probar código JavaScript en modo por lotes [batch mode] o interactivamente.

Las propiedades del objeto o son:

  • o.a - un número
  • o.b - un obtenedor que retorna o.a más 1
  • o.c - un modificador que configura el valor de o.a a la mitad de su valor
js> o = new Object;
[object Object]
js> o = {a:7, get b() {return this.a+1; }, set c(x) {this.a = x/2}};
[object Object]
js> o.a
7
js> o.b
8
js> o.c = 50
js> o.a
25
js>

Esta sesión shell de JavaScript ilustra como los obtenedores y los modificadores pueden extender el prototipo Date para añadir la propiedad año a todas las instancias de la clase predefinida Date. Esta utiliza los métodos getFullYear y setFullYear existentes de la clase Date para soportar los obtenedores y modificadores de la propiedad year.

Estas sentencias definen un obtenedor y un modificador para la propiedad year:

js> var d = Date.prototype;
js> d.__defineGetter__("year", function() { return this.getFullYear(); });
js> d.__defineSetter__("year", function(y) { this.setFullYear(y); });

Estas sentencias utilizan el obtenedor y modificador en un objeto Date:

js> var ahora = new Date;
js> print(ahora.year); //la propiedad año incluida en el prototipo es considerada como un get(año)
2000
js> ahora.year=2001; //la propiedad año incluida en el prototipo es considerada como un set(año)
987617605170
js> print(year);
Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001
Durante el desarrollo de JavaScript 1.5, hubo un corto período en el cual las expresiones incluían getter = o setter = que fueron utilizados para definir nuevos obtenedores o modificadores sobre objetos existentes. Esta sintaxis es ahora altamente desaprobada, causará una alerta o [warning] en los motores JS 1.5 y llegarían a convertirse en un error de sintaxis en el futuro. Esta sintaxis debe ser evitada.

[editar] Resumen

En principio, los obtenedores y modificadores pueden ser tanto:

  • definidos utilizando Objetos Iniciadores, o
  • añadidos posteriormene a cualquier objeto en cualquier tiempo utilizando un método añadido obtenedor o modificador.

Cuando se definen obtenedores y modificadores utilizando Objetos Iniciadores todo lo que necesita hacer es prefijar un método obtenedor con get y un método modificador con set. Por supuesto, el método obtenedor no deberá esperar un parámetro, mientras que un método modificador espera exactament un parámetro (el nuevo valor para modificar). Por ejemplo:

o = {
  a:7,
  get b() { return this.a+1; },
  set c(x) { this.a = x/2; }
};

Los obtenedores y modificadores también pueden ser añadidos a un objeto en cualquier tiempo despues de la creación utilizando dos métodos especiales llamados __defineGetter__ y __defineSetter__. Ambos métodos experan el nombre de el obtenedor o modificador como su primer parámetro, en forma de una cadena. El segundo parámetro es la funciona a invocarse como obtenedor o modificador. Por ejemplo (siguiendo el ejemplo anterior):

o.__defineGetter__("b", function() { return this.a+1; });
o.__defineSetter__("c", function(x) { this.a = x/2; });

Cualesquiera de las dos formas dependen de su estilo de programación y de la tarea actual a programarse. Si ya se decide por utilizar un objeto iniciador cuando define un prototipo problemente la mayor parte del tiempo deberá escoger la primera forma. Esta forma es más compacta y natural. Sin embargo, si necesita añadir obtenedores y modificadores posteriormente – debido a que no escribió el prototipo o un objeto particular – entonces la segunda forma es la única posible manera. La segunda forma probablemente represente mejor la naturaleza dinámica de JavaScript – pero puede hacer del código difícil de leer y entender.