
¿Sabías que a las clases les encanta tener secretos?. A veces, esos secretos los comparten con las clases hijas, a veces no los comparten con nadie y, otras veces, los comparten con todo el mundo, entonces no son secretos. ¿Querés saber cómo guardan secretos las clases?, ¿querés saber cómo se comparten esos secretos entre una clase y otra sin que se entere el resto del mundo?. Entonces, ¡seguí leyendo!.
Existe un mecanismo en la programación orientada a objetos, en este caso usando Typescript, que permite hacer visibles o no, métodos y atributos de una clase. Este mecanismo se llama modificadores. Estos modificadores pueden modificar la visibilidad, tanto de un atributo, cómo de un método.
“
Modificadores: mecanismo por el cual se permite hacer visibles o no, atributos y métodos de una clase.
Existen cuatro tipos de modificadores dependiendo de qué tan visible querés que sea un atributo, estos modificadores son: public, private, protected y readonly
Modificador public
El modificador public es el que viene por defecto en Typescript; cuando no indicás ningún modificador, el lenguaje pone por defecto este modificador. Lo que hace, es hacer visibles para todo el mundo el atributo que lo precede:
class TodosSabenMisSecretos { secreto1='este atributo es público'; public secreto2='este otro método también es público' } /* el mundo exterior */ let clasePublica = new TodosSabenMisSecretos(); console.log(clasePublica.secreto1); //OKA lectura console.log(clasePublica.secreto2); //OKA lectura clasePublica.secreto1 = ‘nuevo secreto’; //OKA escritura clasePublica.secreto2 = ‘otro nuevo secreto; //OKA escritura
Secretos de la clase (modificador private)
El modificador private, por otro lado, es lo opuesto a public. Este modificador restringe la visibilidad de los atributos de la clase sólo a esta clase. Dicho de otra manera, nadie más que la clase tiene acceso a estos atributos, tanto para leer como para modificarlos.
class SoloYoSeMisSecretos { private secretoSoloLectura='Mi secreto'; } /* el mundo exterior */ let objetoConSecretos = new SoloYoSeMisSecretos(); console.log(objetoConSecretos.secretoSoloLectura); //ERROR LECTURA objetoConSecretos.secretoSoloLectura = 'otro secreto' //ERROR ESCRITURA
Secretos entre clases (modificador protected)
¿Se puede saber si una clase puede heredar de otra y tener acceso a todos los atributos de ésta?. Es posible claro, si sus métodos y atributos son no son privados. Pero… ¿qué pasaría si quisieras que una clase “hija” tenga acceso a los atributos de la clase “padre”, pero estos métodos no tengan acceso a el “mundo exterior”?
Para eso existe el modificador protected, que es lo que hace exactamente. Protected hace visible atributos entre clases padre e hijas, pero los hace no-visibles al resto del mundo.
class ClasePadre { protected atributoProtected:string; } class ClaseHija extends ClasePadre { constructor() { super(); this.atributoProtected='Este es un secreto entre ClasePadre' } } let hija = new ClaseHija(); console.log('cuál es el secreto?', hija.atributoProtected) //esto nos tira un error
Cómo ves, el código nos arroja un error ya que no podemos acceder al atributo atributoProtected, éste sólo es accesible entre las clases padre e hija.
Secretos de lectura (modificador readonly)
El modificador readonly, como su nombre lo indica, permite sólo la lectura de un atributo ya que, en caso de querer modificarlo el código arrojaría un error.
class SóloYoModificoMisSecretos { readonly secretoSoloLectura='este atributo es privado'; } /* el mundo exterior */ let objetoSoloLectura = new SóloYoModificoMisSecretos(); console.log(objetoSoloLectura.secretoSoloLectura); //OK objetoSoloLectura.secretoSoloLectura = 'otro secreto' //ERROR
¿Y qué pasa con los constructor abreviados?
¿Te acordás la forma de los constructores abreviados?:
class Persona { constructor(nuevoNombre:string, nuevoApellido:string) { } }
Por defecto, si no se agregan modificadores en los atributos que se le pasan al constructor, estos serán public. Si se quisiera declarar los atributos como protected, private o readonly, se podría hacer sin problemas de la siguiente forma:
class Persona { constructor( public nombre:string, readonly apellido:string, private direccion:string ) { } } let nuevaPersona = new Persona('Gustavo', 'Dohara', 'Mi dirección'); console.log(nuevaPersona.nombre); // public console.log(nuevaPersona.apellido) //read only console.log(nuevaPersona.direccion) //ERROR esto es private
Conclusión
Restringir el acceso de los atributos de una clase es fundamental para la programación orientada a objetos. Como cada clase es una caja cerrada, uno debe cuidar qué atributos puede o no modificar el que use esa clase. Permitir el acceso de todos los atributos de una clase, o permitir que cualquiera pueda modificar su estado (sus atributos), puede hacer que tu código se rompa. Así que mucho cuidado a quién le dejas las llaves de tu casa y el acceso a los atributos de tus clases.