Objota O mundo orientado a objetos

Simulando herança em JavaScript

Posted on fevereiro 14, 2011

Já faz algum tempo que escrevi um artigo de como fazer classes em javascript, porém foi somente uma introdução. Na verdade javascript não é uma linguagem orientada a objetos, ela somente possui alguns recursos que possibilitam simular este conceito de programação.

Se fossemos comparar com todos os recursos que Java (por exemplo) disponibiliza, seria uma completa injustiça, pois atende em peso este conceito. Enquanto javascript sustenta-se apenas com functions, prototipagem e alguns métodos especiais.

Mesmo assim consegue simular uma série de conceitos da orientação a objetos, como:

  • Estruturas de objeto
  • Herança de atributos e métodos – (entre functions)

E pode acreditar, com isso já dá pra fazer muita coisa. Então mão na massa.

Existem várias formas de se fazer esta simulação, mas vou mostrar os métodos que prefiro usar, pois demonstra ter mais organização.

Herança via métodos call e apply

Call:

call( objeto, argumento1, argumento2, argumento3)

Apply:

apply( objeto, ArrayDeArgumentos )

Ambos os métodos trabalham de forma igual, o que eles fazem é trazer o contexto do objeto chamado para dentro do seu objeto atual, não entendeu?.  Vendo é mais fácil!

function Pai( nome, sobreNome){
 this.nome = nome;
 this.sobreNome = sobreNome;
}

function Filho(nome, sobrenome, idade){

 //call chama construtor do objeto Pai
 Pai.call(this, nome, sobrenome);

 this.idade = idade;

 this.mostra = function(){
 alert("Nome completo: "+this.nome+" "+this.sobreNome+"\nIdade: "+this.idade);
 };
}

var objota = new Filho("Maria", "Bonita", 35);

objota.mostra();

Veja que neste exemplo o que fiz foi chamar o construtor do objeto Pai, utilizando a função call. E veja que passei os parâmetros nome e sobrenome.

Agora vejamos este outro exemplo utilizando o método apply. Prefiro esse pois você escreve menos! Hehehe.


function Pai( nome, sobrenome){
 this.nome = nome;
 this.sobreNome = sobrenome;
}

function Filho(nome, sobrenome, idade){

 //apply chama construtor do objeto Pai
 Pai.apply(this, arguments);

 //também pode ser:
 //Pai.apply(this, new Array(nome, sobrenome));

 this.idade = idade;

 this.mostra = function(){
 alert("Nome completo: "+this.nome+" "+this.sobreNome+"\nIdade: "+this.idade);
 };
}

var objota = new Filho("Maria", "Bonita", 35);

objota.mostra();

Como vimos anteriormente o método apply recebe um array com os argumentos, certo. Então. A grande vantagem dele é que podemos utilizar a propriedade arguments herdada do objeto global (que todo objeto em javascript possui). Ele é um array justamente com todos os argumentos necessários para a construção do objeto pai. A única vantagem é a facilidade de implementação caso o objeto em questão tenha muitos argumentos. Você escreve bem menos.

Estes métodos pra mim já dão conta do recado, se você quiser se aprofundar um pouco mais aqui vai pelo menos os nomes dos outros métodos utilizados.

Herança via Object masquerading

Herança via Prototype

Multipla herança

É isso galera, até a próxima. E qualquer coisa comente aí.

Posted by Rodrigo Ireno

Comentários (2) Trackbacks (0)
  1. Muito bom, me esclareceu algumas duvidas das propriedades.

  2. Excelente artigo amigo. Me ajudou muito a informação sobre a referência de objetos no javascript. Legal mesmo a interação dos JSON com o stringfy, que é bem bacana também. Seria legal também algo sobre classes com JSON em java, seria muito bem vindo!!

    Abraços amigo!
    Rodolfo Jorge Nemer Nogueira
    Curitiba / Paraná
    UFPR – Música


Leave a comment

Sem trackbacks