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