Atributos privados en objectos Javascript

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