miércoles, 4 de diciembre de 2013

Variables privadas en javascript



En esta entrada quiero abordar el tema de la implementación de variables privadas en un objeto javascript. Seguramente para muchas personas resultará muy básico, pero en proyectos que he participado y en los cursos que imparto me he encontrado que no se conoce esta característica de los objetos implementados en javascript.

Comenzaremos con un objeto sumamente sencillo y plantearemos algunas interrogantes que resultarán interesantes:
function Persona(nombre, apellido, edad) { this.Nombre = nombre; this.Apellido = apellido; this.Edad = edad; }

Notemos que se está declarando un objeto Persona que tendrá tres propiedades públicas: Nombre, Apellido y Edad. Podemos perfectamente validar la información que estamos recibiendo antes de asignarla a nuestras propiedades de la siguiente manera:
function Persona(nombre, apellido, edad) { this.Nombre = nombre; this.Apellido = apellido; if (!isNaN(edad) && Number(edad) > 18) { this.Edad = edad; } else { this.Edad = null; } } var prueba = new Persona('Pepe', 'Pérez', 30); if (prueba.Edad) alert('La edad es: ' + String(prueba.Edad)); else alert('La edad no fue asignada');

Si primero lo probamos con 30 veremos que la edad es correctamente asignada, pero si le asignamos un valor menor o igual a 18 o bien una palabra, veremos que la propiedad Edad tendrá un valor null.

Hasta ahora todo va bien, pero, ¿qué pasa si una vez que es construido el objeto le asignamos un valor no válido a la propiedad pública Edad?:
var prueba = new Persona('Pepe', 'Pérez', 'Hola'); if (prueba.Edad) alert('La edad es: ' + String(prueba.Edad)); else { alert('La edad no fue asignada'); prueba.Edad = 'Hola'; alert('La edad es: ' + prueba.Edad); }

Veremos que el valor 'Hola' habrá sido asignado a Edad sin problema alguno.

Para evitar este problema y validar la información antes de que ésta sea actualizada en nuestros objetos, podemos implementar miembros privados expuestos a través de funciones públicas. En este caso lo haremos con la Edad:
function Persona(nombre, apellido, edad) { this.Nombre = nombre; this.Apellido = apellido; var m_Edad = null; if (!isNaN(edad) && Number(edad) > 18) { m_Edad = edad; } this.getEdad = function () { return m_Edad; } this.setEdad = function (e) { if (!isNaN(edad) && Number(edad) > 18) { m_Edad = edad; } } }

Veamos que ya no existe la propiedad pública Edad, ahora tenemos un miembro privado llamado m_Edad el cual es leído a través de la función getEdad y actualizado a través de la función setEdad. Dentro de la función setEdad estamos validando que sea una edad válida, una vez que pasó nuestra validación, procedemos a asignar el valor. Probemos con el código que habíamos escrito antes con unas pequeñas adecuaciones para utilizar las nuevas funciones:
var prueba = new Persona('Pepe', 'Pérez', 'Hola'); if (prueba.getEdad()) alert('La edad es: ' + String(prueba.getEdad())); else { alert('La edad no fue asignada'); prueba.setEdad('Hola'); alert('La edad es: ' + prueba.getEdad()); }

Veremos que el segundo mensaje mostrará 'La edad es: null', esto se debe a que la edad 'Hola' no fue asignada a nuestro miembro privado m_Edad debido a que no era un valor válido.

Espero te haya resultado de utilidad esta pequeña entrada, nos vemos la siguiente.

No hay comentarios.:

Publicar un comentario