lunes, 25 de agosto de 2014

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

No hay comentarios: