Cómo es sabido una de las caracteristicas principales de cualquier lenguaje de programación orientada a objetos es la posibilidad de agregarle privacidad a algunos atributos previamente identificados, este principio tiene el nombre de encapsulamiento.
Esto nos ayuda para controlar el comportamiento de un objeto, denegando que otros puedan acceder o cambiar valores a sus atributos o usar sus métodos que no deberían de ser usados. Un ejemplo simple sería algo así:
Supongamos que tenemos una clase Automovil que tiene un atributo propietario que es un objeto de la clase Persona, si los atributos de la clase Persona no estuvieran protegidos , la Clase Automovil podría cambiar el nombre de una manera poco ortodoxa , en Java sería algo así "propietario.nombre = "Maria" " algo que no es recomendado y que es un error a la hora de programar Orientado a objetos, para eso tenemos que establecer como privado los atributos de Persona y crear métodos "Set" y "Gets" para los valores que queramos acceder en otra parte del programa "propietario.setNombre("Maria")".
Ahora el problema en Javascript es que no existe la forma de hacer los atributos privados (recordemos en Javascript no existen clases como tal ya que es orientado a objetos basado en prototipos). Supongamos que queremos hacer el mismo ejemplo (sin utilizar class de ecmascript 6) sería algo cómo:
let Persona = function(){
let nombre = ''";
let edad = ""
}
Aquí no hay una forma "sencilla" de hacer nombre y edad privados como por ejemplo en Java. Tendremós que solucionar esto de una manera un poco creativa. Una de las maneras de agregarle privacidad a los atributos de un Objeto en javascript sería la siguiente:
var Persona = function() {
var nombre = ''";
var edad = ''";
return {
setNombre: function(nom){
nombre = nom;
},
getNombre: function() {
return nombre;
}
}
}
Aquí aprovechamos el scope de función que tiene Javascript para hacer las variables privadas y tener acceso al valor de estas mediante los métodos get que creemos .
var Automovil = function(){
var marca = ''";
var propietario = new Persona();
return {
setMarca: function(marc){
this.marca = marc;
},
getMarca: function() {
return this.marca;
},
getPropietario: function(){
return this.propietario;
}
}
}
var ford = new Automovil();
ford.getPropietario() .setNombre('Maria');
console.log(ford.getPropietario().getNombre());
Y aquí completamos el ejemplo.