¿Una forma de encapsulte (agregar privacidad) a los modelos en el MVC?

Nombro espacios de nombres a mis modelos y un solo controlador como este:

var MC = {};

y luego agregó las propiedades según sea necesario.

Por ejemplo, el código que inicializa todos mis modelos se ve así:

MC.initAll = function() {

    MC.MASettings.init();
    MC.MATweet.init();

    MC.MUserTry.init();
    MC.MUserNew.init();
    MC.MUserExist.init();

    Su.UserOut.init();
    Su.Media.init();
}

Planeo cambiar esto a un bucle ... simplemente recorra en MC, y si existe init () ejecútelo.

Lo único que me molesta de esta arquitectura es que no hay privacidad ni encapsulación en el sentido tradicional de que todo es público.

Además, no hago una instancia de mis modelos, solo los llamo funciones, pero esto es casi lo mismo que la creación de instancias en .js.

¿Existe una forma sencilla de agregar privacidad a mis modelos y aún tenerlos accesibles como propiedades en un objeto?

Sólo por un ejemplo, aquí está mi modelo más simple:

MC.MUserTry = {
    init: function() {
        document.getElementById( 'ut_but' ).addEventListener( "click", function( ) {
            MC.Controller( MC.o_p( 'MUserTry' ) );
        }, false );
    },
    pre : function( o_p ) {
        o_p.page.email = document.getElementById( 'ut_but' ).getAttribute( 'data-email' );
        return o_p; 
    },
    post : function( o_p ) {
        sLocal( o_p.server.hash, o_p.server.privacy, o_p.server.name, o_p.server.picture, 'ma' );
        vStateUpdate( o_p.server.name, o_p.server.picture, o_p.server.privacy );
        vTPane( o_p.server.tweets ); vBPane( o_p.server.bookmarks ); 
        vFlipP( 'ma' ); 
    }
};

pre () se ejecuta antes de una llamada ajax, post () after, e init () se llama a través de un evento onload o similar.

Aquí está el controlador que realmente implementa esto.

MC.Controller = function( o_p ) {

   console.log( 'o_p = ' + o_p.model );

   var t1, t2, t3, t4, 
       i1, i2, i3, i4,
       o_p_string_send;

    if( SU.get('debug') ) {
        t1 = new Date().getTime();
    }

    o_p = MC[ o_p.model ].pre( o_p );  

    if ( o_p.result !== 'complete' ) {
        o_p_string_send = JSON.stringify( o_p );

        if( SU.get('debug') ) {
            t2 = new Date().getTime();
            console.log( '---------------Server Send: \n ' + o_p_string_send );
        } 

        cMachine( 'pipe=' + o_p_string_send , function( o_p_string_receive ) {

            if( SU.get('debug') ) { 
                console.log( '---------------Server Receive: \n ' + o_p_string_receive ); 
                t3 = new Date().getTime();
            }

            o_p.server = JSON.parse( o_p_string_receive );

            MC[ o_p.model ].post( o_p );

            if( SU.get('debug') ) {
                t4 = new Date().getTime(); i1 = t2-t1 ; i2 = t3-t2 ; i3 = t4-t3; i4 = o_p.server.time;
                console.log( '---------------Time: \n Pre | Transit | Post | Server = ', i1, ' | ', i2, ' | ', i3,' | ', i4 );  
            }

        } );
    }
};

Me gustaría añadir privacidad. ¿Cómo hago esto y sigo manteniendo a mis modelos accesibles como propiedades de objeto?

Relacionado

¿Cómo crear objetos globales basados ​​en instancias desde el ámbito local?

Respuestas a la pregunta(2)

Su respuesta a la pregunta