Object.prototype.watch()

by 3 contributors:

Resumen

Controla si se asigna un valor a una propiedad y ejecuta una función cuando esto ocurre.

Sintaxis

watch( propiedad , delegado )

Parámetros

nombrePropiedad
Nombre de la propiedad del objeto.
funcionDelegada
Función a llamar.

Descripción

Controla si se asigna una propiedad llamada nombrePropiedad en este objeto, llamando a funcionDelegada(propiedad, valorViejo, valorNuevo) siempre que nombrePropiedad sea asignada y almacene el valor de retorno de esa propiedad. La función encargada de dicho control puede filtrar (o anular) el valor asignado, devolviendo un valorNuevo modificado (o devolviendo valorViejo).

Si elimina una propiedad para la que se ha establecido un control, ese control no desaparece. Si más tarde se vuelve a crear la propiedad, el control volverá a tener efecto.

Para eliminar un control, use el método Object.prototype.unwatch(). Por defecto, el método watch se hereda para cada uno de los objetos descendientes de Object.

El depurador JavaScript tiene funciones similares a las que proporciona este método, además de otras opciones de depuración. Para más información sobre el depurador, vea Venkman.

En NES 3.0 y 4.x, funcionDelegada se llama desde las asignaciones del script además del código nativo. En Firefox, funcionDelegada se llama solamente en las asignaciones del script, pero no en el código nativo. Por ejemplo, window.watch('location', miDelegado) no llamará a miDelegado si el usuario hace click sobre un enlace a un ancla dentro del documento actual. Sin embargo, el siguiente código llamará a miDelegado:

window.location += '#miAncla';

Ejemplos

Ejemplo: Usando watch y unwatch

var objeto = {p:1};
objeto.watch("p",
   function (identificador,valorViejo,valorNuevo) {
      document.writeln("objeto." + identificador + " ha cambiado de "
         + valorViejo + " a " + valorNuevo);
      return valorNuevo;
   });

objeto.p = 2;
objeto.p = 3;
delete objeto.p;
objeto.p = 4;

objeto.unwatch('p');
objeto.p = 5;

Este script muestra lo siguiente:

objeto.p ha cambiado de 1 a 2
objeto.p ha cambiado de 2 a 3
objeto.p ha cambiado de undefined a 4

Ejemplo: Usando watch para validar las propiedades de un objeto

Usted puede usar watch para comprobar cualquier asignación a las propiedades de un objecto. Este ejemplo asegura que cada Persona siempre tiene un nombre válido y una edad entre 0 y 200.

Persona = function(nombre,edad) {
  this.watch("edad", Persona.prototype._esAsignacionValida);
  this.watch("nombre",Persona.prototype._esAsignacionValida);
  this.nombre=nombre;
  this.edad=edad;
};

Persona.prototype.toString = function() { return this.nombre + "," + this.edad;};

Persona.prototype._esAsignacionValida = function(identificador,valorViejo,valorNuevo) {
  if (id=="nombre" && (!valorNuevo|| valorNuevo.length>30)) { throw new RangeError("nombre no válido para " + this); }
  if (id=="edad"  && (valorNuevo<0 || valorNuevo>200))      { throw new RangeError("edad no válida para " + this ); }
  return valorNuevo;
};

alejandra = new Persona("Alejandra",29); // --> Alejandra,29
document.writeln(alejandra);

try {
  alejandra.nombre="";  // --> Error "nombre no válido para  Alejandra,29"
} catch (excepcion) { document.writeln(excepcion); }

try {
  alejandra.edad=-4;   // --> Error "edad no válida para  Alejandra,29"
} catch (excepcion) { document.writeln(excepcion); }

Este script muestra lo siguiente:

Alejandra,29
RangeError: nombre no válido para  Alejandra,29
RangeError: edad no válida para  Alejandra,29

Vea También

Etiquetas y colaboradores del documento

Contributors to this page: teoli, Mgjbot, Talisker
Última actualización por: teoli,
Ocultar la barra lateral