Patrón javascript para OOP


Se refiere a usar un estilo de programación orientada a objetos en javascript.

Las funciones anónimas crean una closure dentro de ellas permitiendo que todo el scope quede oculto al exterior y accesible al interior y con ello ya tendríamos solucionado el acceso “private”.

Pero ¿Cuál sería el mejor método para hacer hacer el acceso explícitamente público ?. Pues usando el siguiente patrón llamado Yahoo Module Pattern que básicamente pone dentro del return todo lo que queramos hacer “public”.

Tomando el ejemplo de Robert Nyman,

var person = function () {

// Acceso Privado
var name = "Robert";

// Acceso Público
return {
getName : function () {
return name;
},
setName : function (newName) {
name = newName;
}
};
}(); // esta sintáxis hace que la función se autoejecute

alert(person.name); // Undefined
alert(person.getName()); // "Robert"
person.setName("Robert Nyman");
alert(person.getName()); // "Robert Nyman"

Observamos cómo hacemos name privada y las funciones de getter y setter públicas.

Si no necesitamos que la función se autoejecute (como es habitual en Node), podemos usar una sintaxis alternativa (pero no tengo claro que equivalente) y que personalmente prefiero a la anterior; Se trata de usar this para referenciar los objetos que queramos hacer públicos.

function Prova() {
// parte privada
var nombre="pere";

function mayus(algo) {
return algo.toUpperCase();
}

// parte pública
this.getName=function() {
// accedemos a la funcion
// "privada" dentro
// del closure
return mayus(nombre);
}

this.setName=function(newName) {
nombre=newName;
}
} // creamos el objeto con new

var p=new Prova();
console.log(p.nombre); // undefined
console.log(p.mayus("Pere Vilas")); // Error: has no method
console.log(p.getName()); // devuelve PERE