Quizás alguien te haya contado que ciertas cosas no se pueden hacer en Javascript, por ejemplo tener atributos privados. Pero gracias a las closures, podemos crear atributos privados en Javascript.
Veamos un ejemplo simple, donde creamos un objeto Persona con dos atributos, nombre (público) y edad (privado):
function Persona (nombre, edad){
this.nombre = nombre;
var edad_ = edad;
this.getEdad = function() {
return edad_;
}
this.setEdad = function(edad) {
edad_ = edad;
}
};
Persona.prototype.presentate = function(){
return 'Nombre: ' + this.nombre + ' | Edad: ' + this.getEdad();
};
Si utilizamos el objeto:
var persona = new Persona('Simon', 28);
console.log(persona); //no vemos el atributo edad_
persona.presentate(); // devolverá: "Nombre: Simon | Edad: 28"
Parece que efectivamente, edad_ ha guardado su valor, pero ¿podremos acceder al atributo?
persona.nombre; //devuelve "Simon"
persona.edad_; // devuelve undefined
Como buen atributo privado, solo podemos acceder a él desde dentro del propio objeto y no desde fuera. Para poder modificar nuestro atributo edad_, usaremos el método setEdad();
persona.setEdad(30);
persona.presentate(); //"Nombre: Simon | Edad: 30"
Y de la misma manera podremos crear métodos privados. Si quisiésemos tener atributos de tipo “Private” y “Protected”, tendríamos que entrar en más detalle, pero como idea inicial creo que es un buen ejemplo.
Si no terminas de ver claro el código, échale un ojo a este artículo de la MDN sobre las Closures