Javascript The Good Parts - Capítulo 5 Herança - Functional

Javascript The Good Parts - Padrão Funcional

by Angelo Rogério Rubin

HTML

<h2>Padrão de Herança - Funcional</h2>
<p>
Uma fraqueza dos padrões de herança que temos visto até agora é que nós não temos nenhuma privacidade.
Todas as propriedades de um objeto são visíveis. Nós não temos variáveis privadas e não há métodos privados. Às vezes, isso não tem importancia, mas às vezes isso é muito importante. Frustrados, alguns programadores desinformados adotaram um padrão de privacidade falso.
</p>
<p>
Se eles têm uma propriedade que eles desejam fazer privada, eles dão-lhe um nome de aparência estranha, com a esperança de que outros usuários do código irão fingir que eles não podem ver os membros que procuram. Felizmente, temos uma alternativa muito melhor em uma aplicação do padrão de módulo.
</p>
<p>
    Começamos fazendo uma função que irá produzir objetos. Vamos dar-lhe um nome que começa com uma letra minúscula, porque não vai exigir o uso do prefixo <em>new</em>. A função contém quatro etapas:
</p>
<ul>
    <li>Cria um novo objeto. Há muitas maneiras de se criar um objeto. Ela pode criar um objeto literal, ou pode chamar uma função construtora com o prefixo <em>new</em>, ou pode usar o método Object.create para criar uma nova instância de um objeto existente, ou pode chamar qualquer função que retorne um objeto.</li>
    <li>Opcionalmente define variáveis de instância privadas e métodos. Estas são apenas variáveis comuns da função.</li>
    <li>Aumenta o novo objeto com métodos. Esses métodos terão acesso privilegiado aos parâmetros e as variáveis definidas na segunda etapa.</li>
    <li>Ela retorna esse novo objeto.</li>
</ul>
<p>
Aqui está um modelo de pseudo-código para um construtor funcional (texto em negrito acrescentado para dar ênfase):
</p>
<pre>
var constructor = function (spec, my) {
    var that, <strong>Other private instance variables;</strong>
    my = my || {};
    <strong>Add shared variables and functions to my</strong>
    that = a new object;
    <strong>Add privileged methods to that</strong>
    return...

CSS

body {
    font-family: Verdana;
}

pre {
    background-color: #CCC;
}

JavaScript

var mammal = function (spec) {
    var that = {};
    that.get_name = function ( ) {
        return spec.name;
    };
    that.says = function ( ) {
        return spec.saying || '';
    };
    return that;
};
var myMammal = mammal({
    name: 'Herb',
    saying: 'Olá'
});
console.log(myMammal.says());

var cat = function (spec) {
    spec.saying = spec.saying || 'meow';
    var that = mammal(spec);
    that.purr = function (n) {
        var i, s = '';
        for (i = 0; i < n; i += 1) {
            if (s) {
                s += '-';
            }
            s += 'r';
        }
        return s;
    };
    that.get_name = function ( ) {
        return that.says( ) + ' ' + spec.name + ' ' + that.says( );
    };
    return that;
}
var myCat = cat({name: 'Henrietta'});
console.log(myCat.get_name());