Elementos de Programação Orientada a Objetos
A linguagem JavaScript permite o desenvolvimento de programas orientados a objetos. Ao desenvolver uma aplicação para web, portanto, é possível pensar orientado a objetos.
Os dois conceitos clássicos da Programação Orientada a Objetos são o objeto e a classe. Em muitas linguagens todo objeto pertence a alguma classe. Para ser criado é preciso que antes haja a classe. Em JavaScript, porém, é possível haver um objeto sem que haja a correspondente classe.
Observação: Estritamente falando, não existe o conceito de classe em JavaScript. Tudo são objetos. Porém, na prática, para o desenvolvedor acostumado com o conceito de classe é aceitável, e prático, pensar que classes existem.
Objetos sem Classe
Para criar um objeto sem vínculo a nenhuma classe basta declarar os seus atributos e respectivos valores.
No exemplo a seguir, o objeto p
possui 3 atributos (turma
, matriculados
e aprovados
) e 2 métodos (incrementeAprovados
e getPercentualAprovacao
).
const p = {
turma: 'INE5646 Programação para Web',
matriculados: 28,
aprovados: 0,
incrementeAprovados: function () {
if (this.aprovados < this.matriculados)
this.aprovados++;
},
getPercentualAprovacao: function () {
return this.aprovados / this.matriculados;
}
};
Para acessar os atributos e executar os métodos basta
let t = p.turma;
let m = p.matriculados;
p.incrementeAprovados();
let pa = p.getPercentualDeAprovacao();
Classes Pré-definidas
JavaScript possui algumas classes pré-definidas e estão disponíveis para uso.
Alguns exemplos destas classes são mostradas a seguir.
Date
Permite representar um instante no tempo.
let agora = new Date();
let mes = agora.getMonth(); // meses de 0 a 11
Map
Permite representar uma tabela de hash.
No exemplo a seguir a tabela de hash estados
tem como chaves as siglas dos estados brasileiros (sc
, sp
e rs
) e associa a cada chave um objeto que armazena o nome do estado e o nome da capital do estado.
A variável capitalSC
armazenará a string Florianópolis
.
const estados = new Map();
estados.set('sc', {nome: 'Santa Catarina', capital: 'Florianópolis'});
estados.set('sp', {nome: 'São Paulo', capital: 'São Paulo'});
estados.set('rs', {nome: 'Rio Grande do Sul', capital: 'Porto Alegre'});
let capitalSC = estados.get('sc').capital;
Leitura Sugerida |
---|
Relação completa de classes pré-definidas. |
POO Baseada em Protótipos |
Classes Definidas Pelo Desenvolvedor
A partir da versão ES2015, também conhecida omo ES6, ficou bem mais simples definir classes e também hierarquia de classes.
No exemplo a seguir temos as seguintes definições:
- Classe Pessoa
- atributos
_nome
e_idade
. Por convenção, atributos iniciados com_
devem ser entendidos como não públicos e nunca devem ser usados fora da classe. - métodos:
get idade
para retornar a idade da pessoaset idade
para alterar a idade de uma pessoaget nome
para retornar o nome da pessoa
- atributos
- Classe PessoaJuridica que é subclasse de Pessoa, ou seja, uma pessoa jurídica é um tipo de pessoa.
- atributos
nome
eidade
herdados dePessoa
- atributo
cpf
- métodos:
- todos os métodos definidos em
Pessoa
get cpf
para retornar o CPF da pessoa jurídica
- todos os métodos definidos em
- atributos
class Pessoa {
constructor (nome, idade) {
this._nome = nome;
this._idade = idade;
}
get idade () {
return this._idade;
}
set idade(idade) {
this._idade = idade;
}
get nome () {
return this._nome;
}
}
class PessoaJuridica extends Pessoa {
constructor(nome, idade, cpf) {
super(nome, idade);
this._cpf = cpf;
}
get cpf() {
return this._cpf;
}
}
O exemplo a seguir mostra como usar as classes Pessoa
e PessoaJuridica
.
// p1 é um objeto da classe Pessoa
let p1 = new Pessoa('Primeira Pessoa', 21);
// p2 é um objeto da classe PessoaJuridica
let p2 = new PessoaJuridica('Segunda Pessoa', 22, 102030);
// nomeP1 é o nome de p1, ou seja, 'Primeira Pessoa'
let nomeP1 = p1.nome;
// idadeP1 é a idade de p1, ou seja, 21
let idadeP1 = p1.idade;
// alterando a idade de p1 para 30
p1.idade = 30;
// agora idadeP1 vale 30
idadeP1 = p1.idade
// nomeP2 é o nome de p2, ou seja, 'Segunda Pessoa'
let nomeP2 = p2.nome;
// cpfP2 é o CPF de p2, ou seja, 102030;
let cpfP2 = p2.cpf;