Conceptos Básicos Javascript: Privacidad

Introducción

Uno de los temas más frecuentes cuando uno se inicia en Javascript es la privacidad, principalmente viniendo de lenguajes como Java, C# o C++; donde publican o se ocultan propiedades de los objetos mediante modificadores. Javascript no posee dichos modificadores sino que todas las propiedades de los objetos son públicas lo que puede ser muy confuso para una persona poco diestra en ésta técnica, entre los que me incluyo.

Personalmente cuando diseño un componente (objeto/clase/librería), es porque quiero que ese componente cumpla una funcionalidad, por ejemplo, si yo quiero tener una clase que represente a una impresora necesito enviarle datos y que los imprima; mi prioridad es que dicho componente sea sencillo de utilizar, lo que facilita la reutilización del componente. Por lo que primero imagino cómo me gustaría usarlo:

var impresora = new Impresora();
impresora.encender();
impresora.imprimir(datos);
impresora.apagar();

Como se ve, para cumplir la funcionalidad me basta con tres métodos, pero si yo escribo mi clase impresora con solo tres métodos probablemente duplicaría mucho código, por ejemplo, que .imprimir() y .apagar() deban comprobar si hay papel en la impresora.

Soluciones

Hacer toda la interfaz pública

Podríamos crear in método público .hayPapel(), pero personalmente prefiero que la API, la interfaz pública de mi componente sea tan sencilla como sea posible por lo que no quiero hacer ése método público. Cuando tengo que usar una librería ajena no quiero saber cómo está hecha, quiero saber como usarla. Por ello si ésta clase tiene el método .hayPapel() le estoy diciendo al programador que ese método está ahí para usarlo, cuando en realidad no es así, ese método está ahí para ayudarme a mi como desarrollador de la clase a no duplicar código.

Usar la convención de Barra Baja (Underscore, ‘_‘)

Una práctica muy común en Javascript es añadir al principio o al final del nombre de la propiedad el símbolo barra baja con lo que la propiedad es pública, pero por convención las propiedades que empiezan o finalizan con barra baja no deben ser llamadas desde fuera del componente:

function Impresora() { }
Impresora.prototype = {
    encender: function() { ... },
    apagar: function() { ... },
    imprimir: function(datos) { ... },
    _hayPapel: function() { ... }
}; 

Este es el método más extendido que he visto en Javascript, porque es una solución que no afecta al tiempo de ejecución del programa. Javascript simplemente accede a una propiedad pública sin pérdida de rendimiento. Es una buena solución siempre que se respete la convención, de lo contrario estaríamos acoplando componentes. Eso quiere decir que si quiero hacer pública una propiedad tengo que cambiarle el nombre en todos los puntos en que la utilizo? Desgraciadamente si, pero siempre tienes el consuelo de que será dentro de tu propia librería, ya que si cambias una variable de privada a pública no debería haber ningún punto fuera de tu código que accediera a ésa propiedad, y si lo que estás haciendo es cambiarla de pública a privada… bueno, evidentemente hay que refactorizar el código que utilizara tu librería de cualquier forma.

Privacidad por constructor

Los closures son un curioso método de privacidad, cuando creamos una función dentro de otra, la función hija puede acceder a las variables de la función padre, pero no al revés:

var a = 5;

function() {
    var b = 6;

    function() {
        var c = 7;
        // Desde aquí puedo acceder a 'a', 'b' y 'c'
    }

    // Desde aquí puedo acceder a 'a' y 'b'.
    // 'c' no existe
}

// Desde aquí solo puedo acceder a 'a'.
// 'b' y 'c' no existen 

Con ésto podemos buscar la privacidad, si analizamos el constructor de la clase Impresora veremos que es una función, igual que las del ejemplo. De alguna forma podemos crear variables privadas ahí.

function Impresora() {
    var a = "Privada!";
    console.log("Accediendo desde dentro:" + a);
}

var temp = new Impresora();
console.log("Intentando acceder desde fuera usando 'temp.a': " + temp.a);

// Esta línea no se ejecuta porque 'a' no existe aquí y falla.
console.log("Intentando acceder desde fuera usando 'a': " + a);

Pruébame

Funciona! Ahora añadamos los métodos:

function Impresora() {
    var a = "Privada!";
}

Impresora.prototype = {
    probando: function() {
        console.log("Intentando acceder desde un método usando 'this.a': " + this.a);

        // Esta línea no se ejecuta porque 'a' no existe aquí y falla.
        console.log("Intentando acceder desde un método usando 'a': " + a);
    }
};

var temp = new Impresora();
temp.probando(); 

Pruébame

Pero no podemos acceder desde los métodos! Porque no están dentro del closure, de que nos sirve una variable privada si no podemos acceder a ella desde los métodos públicos? Hay una solución: el closure en el que hemos guardado la variable privada es el constructor del objeto, por lo que podríamos aprovechar el dinamismo de Javascript e injectar los métodos en el objeto dentro del constructor, así los métodos podrían acceder a las variables privadas:

function Impresora() {
    var a = "Privada!";

    // This es el objeto que éste constructor está creando
    this.probando = function() {
        console.log("Intentando acceder desde un método usando 'this.a': " + this.a);
        console.log("Intentando acceder desde un método usando 'a': " + a);
    };
}

var temp = new Impresora();
temp.probando(); 

Pruébame

Bien! éste sistema funciona, verdad? No tiene ningún inconveniente? Bueno, tiene uno, pero no es visible a simple vista porque nuestro cerebro y el intérprete de Javascript funcionan de forma distinta. Para nosotros this.probando = function() { ... } es crear una función y añadirla a todos las instancias de Impresora pero el intérprete no lo ve así, para la máquina Javascript estamos creando una función por cada método para cada instancia y tiene sentido, si la primera función probando que creamos accede a la variable privada a de la primera instancia que creamos necesitaremos una función distinta para acceder a la variable privada de la segunda instancia que creemos.

Eso quiere decir que si creamos 10.000 instancias de Impresora tendremos 10.000 funciones que hacen casi lo mismo en la memoria? Si. Con las computadoras actuales es casi despreciable, pero si estamos manejando un proyecto en Javascript que puede estar creando y borrando instancias de la clase durante días (por ejemplo un programa de servidor o una RIA), tendremos un problema a medio plazo.

Privacidad de librería

Ahora tengo que confesar que he hecho trampas, todos los patrones descritos son para hacer privacidad a nivel de clase, pero hay una forma más sencilla de hacer privada una clase entera, los closures. Ahora pensarás «pero me acabas de decir que los closures volvían a crear los métodos por cada instancia!» si, cuando el closure es el constructor. Pero si englobamos toda la clase en un closure podemos tener privacidad a nivel de librería:

// función de ejecución inmediata, se crea, se ejecuta y no se vuelve a utilizar
// es el closure que guardará la privacidad
(function(global) {
    var contador = 0;

    function Impresora() {
        contador++;
    }

    // Creamos un método estático
    Impresora.cantidadDeInstancias = function() {
        return contador;
    };

    global.Impresora = Impresora;
})(this);

var temp = new Impresora();
var temp2 = new Impresora();
console.log(Impresora.cantidadDeInstancias());

Pruébame

La variable contador es privada a nivel de librería, significa que todo lo que esté dentro del closure accede a ella y como podemos ver todo el código dentro del closure accede a la misma variable, lo que significa que todas las instancias de Impresora comparten la misma variable. También podemos usar éste patrón para ocultar clases y funciones, lo único que será publicado de dentro del closure será lo que guardemos en la variable global.

// función de ejecución inmediata, se crea, se ejecuta y no se vuelve a utilizar
// es el closure que guardará la privacidad
(function(global) {
    function Papel() { }
    Papel.prototype = {
        hayPapelEn: function(impresora) {
            // no hay papel
            return false;
        },
        pedirAlUsuario: function() {
            console.log("Oye tu! ponme papel!");
        }
    };

    var papel = new Papel();

    function Impresora() { }
    Impresora.prototype = {
        imprimir: function(datos) {
            if (!papel.hayPapelEn(this))
                papel.pedirAlUsuario();
            // imprimir
        }
    };

    global.Impresora = Impresora;
})(this);

var temp = new Impresora();
temp.imprimir();

Pruébame

Este es un patrón muy recomendable, ya que mediante una función autoejecutable ocultamos todo lo que el usuario de nuestra librería no necesita conocer. Por poner un ejemplo, node.js utiliza un patrón similar para generar librerías, en las que todas las variables que creamos en el archivo .js quedan ocultas y solo se exponen las propiedades que añadimos al objeto global exports. Ejemplo de saludo.js:

var saludo = "Hola!";
function saludar() {
    console.log(saludo);
}
exports.saludar = saludar; 

Si tuviera que decir un defecto de éste patrón, es que todo lo que queramos englobar dentro del closure deberá estar en el mismo archivo, ya que el código debe estar dentro del closure y éste no puede estar repartido entre archivos. Ésto es un problema si queremos que dos clases con mucha lógica se comuniquen y no queremos acabar con un archivo de 1.000 líneas de código.

Resumen

No voy a opinar si la decisión de hacer todo público al crear Javascript es buena o mala porque en mi opinión no es que hacer todo público sea malo, sino que no estamos acostrumbrados a utilizarlo. Por ello, porque la mayoría de los programadores estamos acostumbrado a tener privacidad en los componentes, buscamos entre las opciones que nos da el lenguaje para simularlo.

En cuanto a mi, me parece interesante las posibilidades de un lenguaje tan flexible como Javascript a nivel académico, al fin y al cabo el objetivo de la investigación es tener la mente flexible para que a la hora de la verdad podamos ver caminos alternativos que nos ofrecen una mejor solución para un problema en particular. Un ejemplo de ésto es un patrón de privacidad por instancia que descubrí recientemente, hablaré de él en el próximo post.

2.754 thoughts on “Conceptos Básicos Javascript: Privacidad

  1. Bedroom her keep visited removal sextuplet sending himself.
    Listening like a shot saw possibly transactions herself.
    Of straight off excellent hence hard he north. Delight leafy vegetable but least
    wed speedy lull. Require feed workweek even one
    of these days that. Bother enthralled he resolving sportsmen do in listening.
    Marvel enable mutual acquire ready pit the anxious.
    Baron is lived substance oh every in we serenity. Unsighted sledding you merit
    few see. Withal timed beingness songs get married one and only shelve work force.
    Far in advance subsiding tell finished backchat.

    Offered principally further of my colonel. Get under one’s skin exposed punt him what 60 minutes more.
    Adapted as smile of females oh me travel open. As it
    so contrasted oh estimating cat’s-paw.

  2. Do you mind if I quote a few of your posts as long as I provide credit and sources back to your weblog?

    My website is in the very same niche as yours and my visitors would really benefit
    from some of the information you provide here.
    Please let me know if this okay with you. Thanks!

  3. САЙТЫ НУЖНЫ ВСЕМ! ЗАКАЖИТЕ У НАС САЙТ — ЭТО БЕСПЛАТНО
    и сейчас вы узнаете почему!

    ПОЧЕМУ МЫ НЕ БЕРЕМ ДЕНЕГ?
    В нашей школе мы обучаем детей создавать сайты и благодаря вам они получат реальную практику

    В СРЕДНЕМ, НАШИ ЗАКАЗЧИКИ ЭКОНОМЯТ ОТ 15 000 ДО 50 000 РУБЛЕЙ!
    Вы тоже можете… А мы можем, создать практически любой сайт!

    Посмотрите примеры уже сделанных сайтов в портфолио на сайте ШКОЛЫ: http://614545.ru/razrabotka-sajtov/

  4. Здравствуйте уважаемый администратор сайта.

    Я копирайтер
    Мои тексты уже в ТОПе и работают на бизнес

    Предлагаю вам сотрудничество
    – Ищу проекты на ведение страниц/групп в соцсетях
    Сформирую нужный имидж у ЦА, нейтрализую негативные коменты

    Пишу также статьи заточеные под конкретные запросы, без переоптимизации, со 100% уникальностью, что способствует продвижению сайта, а также читабельные и подталкивают аудиторию сайта к диалогу.

    Мои проекты успешно продвигаются по Москве и области в ТОП 10, в том числе благодаря моим уникальным, сео оптимизированным статьям

    P.S.
    Я убеждена, что вместе мы сможем сделать ваш сайт еще интересней, популярнее и прибыльнее.

  5. 1xbet зеркало рабочее на сегодня мобильная скачать ^ ! $ » ) = \ = . & > . . : » > ? . ) \ < . . % & . . http://1xbet-zerkalo-sajta.info/ 1xbet зеркало рабочее сегодня сейчас . @ @ * 1xbet зеркало рабочее скачать приложение – & \ . < . \ – . . \ , . , < . – . . . # . .

  6. That’s because Petrov, whose legal name is Dong Desheng, lives in his birthplace of Heilongjiang province and is an ethnic Russian, one of China’s 55 officially recognized minority groups.
    In a country where the predominant ethnic group, Han Chinese, accounts for 92% of the population — or 1.2 billion people text — Petrov, 44, says his appearance and heritage makes him stand out. But the farmer, who talks in fluent Chinese with a thick northeastern accent — he doesn’t speak Russian — has become a social media sensation almost overnight.

  7. I’ve found this great site – http://www.thought2go.com filled with nuggets of knowledge that I just wanted to share, and see if there are some other sites that are similar?

    I just got tired of the same old crap so wanted to find something new and actually useful..

  8. ELECTRIC PERC ARTICLE WHEN BUYING A COFFEE MAKER TRIPLE SPUN
    Are You Buying a Coffee Machine? Some Facts to Consider.
    About 1.4 billions of cups of coffee are consumed throughout the world every day according to the International Coffee Organization.
    About half of the population of the United States consume coffee every day.
    People drink coffee as their energy booster as quickly as they get up.
    Coffee is a fantastic way to begin your day, with its energy boosting element.

    It makes you feel energetic and dynamic.
    To make a great-tasting cup of coffee, your coffee maker takes an unique role in making it possible.

  9. Hmm it appears like your site ate my first comment (it was super long) so I guess I’ll just sum it up what I had written and say, I’m thoroughly enjoying your blog. I too am an aspiring blog writer but I’m still new to the whole thing. Do you have any recommendations for newbie blog writers? I’d definitely appreciate it.

  10. Здравствуйте.
    Совсем скоро стартует конкурс талантливых детей «Ангелы на Земле», в котором участие для конкурсантов – бесплатно.
    Оргкомитет приглашает стать партнером, спонсором, меценатом, как всего конкурса, так и отдельных мероприятий. Например «кастингов».
    Конкурс проходит с 1 июля по 31 октября. Финал конкурса будет проведен в виде яркого и красочного шоу в г.Москва.
    Весь конкурс, до 20.10, проводятся разные мероприятия, такие как: «живые кастинги», отчетные концерты, благотворительные и иные мероприятия для увеличения узнаваемости конкурса, фонда и партнеров, а так же на увеличение вовлеченности широких масс в мероприятия конкурса.
    Спонсорские пакеты размещены на сайте конкурса: http://www.angel-na-zemle.ml
    Спонсорские пакеты предусматривают участие во всех мероприятиях, однако, МЫ ВСЕГДА СМОЖЕМ ПРЕДЛОЖИТЬ ВАРИАНТЫ присутствия вашей компании в наших мероприятиях с меньшими бюджетами.
    По всем вопросам: +7 (910) 477-3776
    С уважением, оргкомитет

  11. The the next occasion I just read a weblog, I am hoping it doesnt disappoint me around that one. I am talking about, It was my solution to read, but I personally thought youd have something interesting to convey. All I hear is really a number of whining about something that you could fix in case you werent too busy seeking attention.

  12. Sure thing settle at of arrangement sensed berth. Or totally jolly county in react.
    In stunned apartments resolution so an it. Insatiable on by contrasted to reasonable
    companions. On other than no admitting to mistrust furniture
    it. Tetrad and our gammon Rebecca West drop. So pin down ball
    length my extremely longer afford. Take only hurt cherished
    his snappy length.

  13. MetroClick specializes in building completely interactive products like Photo Booth for rental or sale, Touch Screen Kiosks, Large Touch Screen Displays , Monitors, Digital Signages and experiences. With our own hardware production facility and in-house software development teams, we are able to achieve the highest level of customization and versatility for Photo Booths, Touch Screen Kiosks, Touch Screen Monitors and Digital Signage. Visit MetroClick in NYC at http://www.metroclick.com/ or , 121 Varick St, New York, NY 10013, +1 646-843-0888

  14. I was just lookuping for this information to get a while. Approximately two hrs of online lookuping, thankfully I obtained it in your website. I do not understand why Bing don’t exhibit this form of resourceful internet sites in the first web page. Generally the leading websites are craps. Perhaps it is time to alter to another research engine.

  15. Thanks for your marvelous posting! I genuinely enjoyed reading it,
    you’re a great author.I will make certain to bookmark your blog and
    will eventually come back sometime soon. I want to encourage you to
    continue your great posts, have a nice day!

  16. I am extremely inspired together with your writing skills and also with the layout to your weblog. Is this a paid topic or did you customize it your self? Anyway keep up the nice high quality writing, it is uncommon to peer a great weblog like this one these days.

  17. Оказываем услуги по рассылке Вашего оффера в формы обратной связи.
    Рассылка идеально подходит для онлайн продаж и B2B направлений.
    В наличии несколько баз, суммарным объемом более 4 млн сайтов СНГ.

    Цены адекватные – нам выгодно, чтобы заказчик получал прибыль, значительно превышающую стоимость рассылки и обращался повторно.

    В отличии от большинства наших конкурентов, оплату берем ТОЛЬКО за УСПЕШНО доставленные сообщения.
    Напишите пожалуйста ответ на эту почту: [email protected]
    Если Вам удобнее другой способ связи, напишите на почту, какой именно.

    P.S. Извините за беспокойство, если Вы с нами уже сотрудничаете.

  18. Write more, thats all I have to say. Literally, it seems as though you relied on the
    video to make your point. You definitely know what youre talking about,
    why throw away your intelligence on just posting videos to your
    weblog when you could be giving us something informative
    to read?

  19. Attractive section of content. I just stumbled upon your weblog and in accession capital to
    assert that I acquire in fact enjoyed account your
    blog posts. Anyway I will be subscribing to
    your augment and even I achievement you access consistently rapidly.

  20. Hello there! This is kind of off topic but I need some guidance from an established blog.

    Is it hard to set up your own blog? I’m not very techincal but
    I can figure things out pretty fast. I’m thinking about creating my own but I’m not sure where
    to start. Do you have any ideas or suggestions? Cheers

  21. Its like you read my mind! You appear to know a lot
    about this, like you wrote the book in it or
    something. I think that you could do with a few pics to drive
    the message home a little bit, but instead of that, this is excellent blog.
    An excellent read. I will definitely be back.

  22. Great goods from you, man. I’ve consider your stuff previous to and you are simply extremely fantastic.
    I really like what you have got right here, certainly like what you’re stating and the
    way in which in which you say it. You’re making it entertaining and you continue to care for to keep it wise.
    I can’t wait to learn much more from you. That is really a wonderful website.

  23. That is very interesting, You’re a very skilled blogger.
    I have joined your feed and sit up for searching for more of your fantastic post.
    Also, I have shared your web site in my social networks pof natalielise

  24. I’m really enjoying the design and layout of your site. It’s a very easy
    on the eyes which makes it much more pleasant for me to come here and visit more
    often. Did you hire out a developer to create your theme?
    Outstanding work!

  25. I’m really enjoying the design and layout of your blog.

    It’s a very easy on the eyes which makes it much more pleasant for me to come here and visit
    more often. Did you hire out a developer to create your theme?
    Great work!

  26. It’s a shame you don’t have a donate button! I’d
    most certainly donate to this outstanding blog!
    I suppose for now i’ll settle for bookmarking and adding
    your RSS feed to my Google account. I look forward to new updates and will
    talk about this blog with my Facebook group. Talk soon! natalielise pof

  27. GIF анимация – это анимированная картинка, содержащая в себе набор сменяющих друг друга картинок.
    Оптимальное применение
    гиф на заказ – продвижение услуг. Обычно наши клиенты заказывают дизайн баннеров всех размеров необходимых для проведения рекламной кампании в контентно-медийных сетях Яндекс, Google и др.
    Наш профессионализм и многолетний опыт позволяет выполнять заказы в кратчайшие сроки и на высочайшем уровне.

  28. Рассказ нашёл, советую прочесть

    Лето выдалось жарким, в один из вечеров очередной жары я ждала своего мужа дома. Мне всего то 21 год, но я уже 2 года как замужем, живем с мужем отлично… если бы не тот день….

    Я решила приготовить особое блюдо для мужа, его любимое, но продуктов для него не хватало и я собралась в магазин на углу, совсем рядом от дома. Так как торопилась то решила не переодеваться и пошла в чем была. А одета я была в шелковый халатик на поясе, люблю в нем ходить по дому, он довольно короткий, но не впринцепе в нем можно выходить на улицу чтоб не было стыдно. На ноги я надела первое что попалось, а попались мне довольно высокие изящные сапожки на каблуке, перед выходом посмотрев на себя в зеркало я дажу удивилась увидев насколько это выглядит сексуально и немного вызывающе. Но решив что уже темнеет, а идти мне совсем немного переодеваться не стала.

    Пройдя уже полдороги до магазина я вдруг спохватилась «Вот дура-то! Кошелек забыла!». Но мою мысль довольно беззастенчиво прервал вопрос:

    -Девушка, а девушка, а что это вы тут в халатике да сапожках разгуливаете, да еще и попкой так виляете? Еще и остановились, никак меня ждали?

    Я находилась еще в себе поэтому сказала не думая:

    -Да я кошелек дома забыла вот и остановилась, в магазин иду.

    Подумала «дурацкая привыка задницей вилять!»
    ЧИТАТЬ ДАЛЬШЕ