Seções iMasters
iMasters InterCon

Principal evento de WordPress da América Latina, dia 29/06 em SP

Inscreva-se
JavaScript

Saiba mais sobre encapsulamento com JavaScript

O JavaScript é a língua franca da Internet. Está em todo lugar, é importante, e não está indo embora. No entanto, um monte de desenvolvedores que usam JavaScript não o entendem muito bem.

Certamente não é por falta de recursos. Na verdade, existem vários recursos ótimos na Internet para aprender JavaScript. Há também ótimos livros, vídeos e apresentações. E, provavelmente, outros tipos de materiais educativos. No entanto, apesar de todos esses recursos, os desenvolvedores ainda acham difícil de aprender.

Talvez a principal razão para isso seja porque o JavaScript não é uma linguagem OO clássica, como C# ou Java. Em outras palavras, JavaScript não depende de classes para implementar os princípios fundamentais de OO, que todos nós aprendemos a amar na escola. Você sabe, coisas como encapsulamento, herança, polimorfismo e abstração.

A boa notícia é que o JavaScript possui outras maneiras de realizar o mesmo objetivo. A notícia potencialmente ruim é que ele é um pouco diferente do que estamos acostumados.

Considere o encapsulamento. Se você se lembrar da sua Introdução à Classe de Programação, o encapsulamento é sobre como ocultar informações e implementação. Os objetos devem expor apenas as propriedades e os métodos que são exigidos para interagir com eles. Todo o resto deve ser escondido. Para ver como esse conceito é implementado em JavaScript, vamos considerar um exemplo.

Criando um boleiro

Conheça Bob, o boleiro. Bob sabe fazer bolos e gosta de usar um ingrediente especial que só ele conhece. Naturalmente, Bob quer manter este ingrediente em segredo. Ele também quer manter para si o método exato que ele usa para preparar bolos (sim, Bob é surpreendentemente secreto). Então, como fazemos Bob?

Bem, em uma linguagem clássica, como C# poderíamos definir uma classe para representar um boleiro. Nós, então, criaríamos outro método de acesso público que pode chamar para fazer bolos. E faríamos todo o resto (ingrediente secreto, passos para assar) privado.

Em JavaScript nós não temos classesRF091186435SG. Então, temos que definir uma função que representa um fabricante de bolo. Variáveis ??particulares, como o ingrediente secreto, podem ser definidas como variáveis ??dentro da função. Métodos privados (como os passos do preparo do bolo) seriam funções internas. Variáveis ??públicas seriam devolvidas em um objeto que os define *.

Talvez, a melhor maneira de entender isso é ver cada um lado a lado:

Como você pode ver, o mecanismo JavaScript para variáveis e comportamentos escondidos aproveita funções ao invés de classes. Essa abordagem também usa um conceito muito poderoso de fechamentos. Sem entrar muito nisso, o closure é uma forma de funções internas (funções definidas dentro de outras funções) acessarem as variáveis ??da função externa.

Só para completar o quadro, a maneira que você cria Bob é usando esse módulo de boleiro, que é bastante similar em ambas linguagens:

Observe que em C# você tem que instanciar uma classe, enquanto que em JavaScript você cria um objeto e o atribui ao valor de retorno da função. Além disso, como C# possui classes, o objeto pode ser inicializado com um construtor, enquanto que o JavaScript requer uma chamada explícita para a função initialize().

A linha final

Assim, apesar de parecerem diferentes, à primeira vista os mecanismos que o JavaScript usa para obter os princípios OO implementados são definitivamente compreensíveis. Eles apenas demoram um pouco para se acostumar.

*Este padrão é apresentado no livro do lendário Doug Crackford, JavaScript: The Good Parts. Falando nisso, não há um livro melhor para realmente aprender JavaScript. Altamente recomendado!

 ***

Artigo original disponível em: http://tatiyants.com/groking-javascript-encapsulation/

Comente também

16 Comentários

Rafael Bilar

Parabéns pelo artigo, muito explicativo e com certeza vou ler o livro recomendado.

Obs.: Na frase ‘Bem, em uma linguagem clássica, como C# poderíamos definir uma classe para representar um boleiro. Nós, então, criarímos outro método de acesso público que pode chamar para fazer bolos. E faríamos todo o resto (ingrediente secreto, passos para assar) privado.’, faltou a letra ‘A’ na palavra ‘criaríAmos’.

Robson Florentino

Excelente artigo, muito simples e focado, e o melhor o exemplo ficou muito didático, tive que explicar a mesma coisa esses dias para algumas pessoas aqui, seu artigo vai esclarecer as dúvidas de muita gente…

Tomamais

Bacana o de->para entre C# e Javascript. Bem esclarecedor :D

Eduardo Arão Reale

Alex, muito obrigado. Vi vários artigos sobre o tema mas nenhum foi tão simples e tão esclarecedor quanto o seu. Essa comparação com C# tornou tudo ainda mais simples.

romulo oliveira

Estava a tempos precisando disso.. muito bom!

Priscila

A comparação foi mais que esclarecedora, valeu cara!

Abraão Alves

Parabéns pelo artigo, mas porque você nao utilizou o ‘new’ do JavaScript nesse exemplo?

Ricardo Mendes

Muito bom o artigo. Parabéns!
A comparação com o “de->para” realmente ajuda muito.

Rafael

Poderia traduzir ao invés de jogar no google translate. In JavaScript, we don’t have classes.Foi traduzido para Em JavaScript nao temos aulas por exemplo… Mesmo assim foi um bom artigo.

Danilo Barreto Bezerra

Bacana eu formava esse conceito na minha mente, mas não imaginava algo assim ilustrado, vou procurar o lviro recomendado.
Parabéns

Daniel Jesus

Bacana só não curti a tradução, chamar closures de “encerramentos” e classes de “aulas”, perde todo o significado e dificulta o entedimento para quem não entende de JS.

Marcelo Rocha

Olá Alex Tatiyants bom artigo, gostaria de saber quais as vantagens da estrutura que você mostrou comparada com a abaixo:

function MinhaClass() {

var var1,
var2;
var oi = function()
{
console.log(‘oi’);
console.log(var1);
}

var ola = function()
{
console.log(‘ola’);
console.log(var2);
}

this.metodo1 = function()
{
ola();
oi();
}

var1 = ‘Valor 1′;
var2 = ‘Valor 2′;
}

var obj2 = new MinhaClass();
obj2.metodo1();

Abraços

Matrix

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

Daniel

Legal o artigo, mas isso não seria JavaScript com JSON?

Jhonatan Simões

Tá… Mais no caso acima se eu quiser herdar a ‘classe’ ?

Qual a sua opinião?