Outras formas de estender classes e objetos
Com a função $extend() do core de Mootools, podemos estender objetos com as propriedades e métodos de outros objetos. Também mostramos como criar classes a partir da extensão de outras classes com objetos.Por Miguel Angel Alvarez - Tradução de JML
Publicado em: 04/2/09
No artigo
Extend: Estendendo classes com Mootools explicamos o que é a extensão de classes, para criar classes novas, a partir de outras já criadas, as quais se acrescentam características e funcionalidades novas. Neste caso vamos continuar vendo modos de trabalho com Mootools na hora de estender classes.
Estender um objeto com as características e funcionalidades de outro
Vamos aprender a utilizar a
função $extend() do core de Mootools, para estender um objeto com outro. Com $extend() indicamos como parâmetros dois objetos e então conseguimos que o objeto do primeiro parâmetro se estenda com as funcionalidades e propriedades do objeto do segundo parâmetro.
Temos estas duas classes das quais criamos dois objetos:
var Computer = new Class({
cpu: "Intel 486",
hd: "180 Mb",
processar: function(x){
alert("Processando " + x);
}
});
meuComputador = new Computador();
var Laptop = new Class({
cpu: "Pentium",
tela: "800x600",
cargaBateria: function(){
alert("Carregando bateria");
}
});
meuLaptop = new Laptop();
São os objetos meuComputador, da classe Computador. E meuLaptop, da classe Laptop. Ambos têm as propriedades e métodos, sendo que alguma propriedade (cpu) está repetida em um e em outro, porém, com valores diferentes.
Agora podemos fazer uso de $extend() desta maneira:
//estendo o objeto meuComputador com as propriedades e métodos de meuLaptop
$extend(meuComputador, meuLaptop);
Com isto consegui que o objeto meuComputador adquira as propriedades e métodos de meuLaptop. Depois deste passo todas as propriedades e métodos de ambos objetos estarão presentes em meuComputador e meuLaptop ficará inalterado. Ademais, a propriedade cpu de meuComputador será igual ao valor que havia no objeto meuLaptop.
Poderíamos executar estas linhas para comprovar os valores dos parâmetros e a presença dos distintos métodos.
//o campo CPU, repetido, toma o valor do objeto do segundo parâmetro
alert(meuComputador.cpu);
alert(meuComputador.hd);
//o campo tela, que era de meuLaptop, fica agora dentro de meuComputador.
alert(meuComputador.tela);
meuComputador.processar("algo");
//o método de meuLaptop fica também em meuComputador.
meuComputador.carregaBateria();
Como assinalávamos, meuLaptop não será alterado, isso podemos comprovar tratando de mostrar a propriedade hd, que não deveria estar nesse objeto.
//o objeto meuLaptop fica inalterado
alert(meuLaptop.hd); //mostrará undefined
Vejamos o
exemplo em funcionamento em uma página à parte.
Estender uma classe através de um objeto
Entre as possibilidades de extend e a extensão de classe em mootools, podem-se acrescentar propriedades e métodos de um objeto a uma classe de mootools. Isto é um pouco estranho, visto que não se entende muito bem para que pode servir estender classes com objetos, já que além do mais são coisas distintas, porém o caso é que se pode e decidi colocar um exemplo, caso tenha utilidade em algum momento a alguém.
Para continuar com o exemplo de classes anterior, vamos criar uma nova classe a partir da classe Computador, que se estendeu com as propriedades e métodos do objeto meuComputador.
var ComputadorLaptop = Computador.extend(meuLaptop);
Com isso temos a classe ComputadorLaptop, que tem as propriedades e métodos da classe Computador, mais os que havia no objeto meuLaptop.
Podemos provar agora o funcionamento desta classe ComputadorLaptop a partir deste código:
meuComputador2 = new ComputadorLaptop();
alert(meuComputador2.cpu);
alert(meuComputador2.hd);
alert(meuComputador2.tela);
meuComputador2.processar("algo");
Podemos
ver o exemplo em funcionamento em uma página à parte.