š Orientação a Objetos ā toJSON(), DAO e Armazenamento Local
Introduçãoā
Neste capĆtulo serĆ” apresentada uma evolução do exemplo de Pessoa JurĆdica (PJ) desenvolvido anteriormente.
A classe PJ passa a possuir uma associação com uma Inscrição Estadual (IE). Em seguida, serĆ” criada uma camada especĆfica para transformar os dados do objeto em uma estrutura adequada Ć serialização em JSON e armazenĆ”-los utilizando uma simulação de localStorage.
O exemplo permite integrar diferentes conceitos jĆ” estudados:
- heranƧa;
- encapsulamento;
- sobrescrita de mƩtodos;
- relacionamentos entre objetos;
- validação com
instanceof; - referĆŖncias cruzadas;
- ES Modules (ESM);
- JSON;
- serialização e desserialização;
- padrão DAO (Data Access Object);
- armazenamento chave-valor.
Relacionamento entre PJ e IE
Uma Pessoa JurĆdica pode possuir uma Inscrição Estadual. Para representar essa situação, serĆ” estabelecido um relacionamento 1:1 entre as classes PJ e IE.
Pessoa
ā²
ā heranƧa
ā
PJ āāāāāāāāā IE
relação
1:1
A classe PJ manterÔ uma referência para um objeto IE. A associação serÔ validada utilizando instanceof.
Além disso, serÔ criada uma referência cruzada, permitindo que o objeto IE também mantenha uma referência para a PJ associada.
Classe PJā
A classe PJ continua sendo uma especialização da classe Pessoa.
Além do atributo #cnpj, jÔ estudado anteriormente, serÔ acrescentado o atributo privado #ie, responsÔvel por armazenar a Inscrição Estadual associada.
š» Código Completoā
Arquivo: /pessoas/PJ.js
const Pessoa = require('./Pessoa');
const IE = require('./IE/IEclss');
class PJ extends Pessoa {
#cnpj;
#ie;
setCNPJ(cnpj) {
if (cnpj) {
if (cnpj.length < 18) {
return false;
}
this.#cnpj = cnpj;
return true;
} else {
return false;
}
}
getCNPJ() {
return this.#cnpj;
}
setEmail(email) {
if (email !== '') {
if (email.includes('@')) {
super.setEmail(email);
return true;
}
} else {
return false;
}
}
setIE(ie) {
if (ie instanceof IE) {
this.#ie = ie;
ie.setPJ(this);
return true;
} else {
return false;
}
}
getIE() {
return this.#ie;
}
}
module.exports = PJ;
š ComentĆ”rios e ExplicaƧƵes Linha a Linhaā
Linhas 01ā02 ā ImportaƧƵesā
const Pessoa = require('./Pessoa');
const IE = require('./IE/IEclss');
Importam as classes necessÔrias para a implementação de PJ.
Pessoa serÔ utilizada como superclasse, enquanto IE serÔ utilizada para estabelecer o relacionamento com a Inscrição Estadual.
Linhas 04ā07 ā HeranƧa e atributos privadosā
class PJ extends Pessoa {
#cnpj;
#ie;
Declara a classe PJ como uma especialização de Pessoa.
Os atributos privados armazenam:
#cnpj: o CNPJ da Pessoa JurĆdica;#ie: a referĆŖncia para o objeto de Inscrição Estadual.
Linhas 09ā22 ā MĆ©todo setCNPJ()ā
setCNPJ(cnpj) {
if (cnpj) {
if (cnpj.length < 18) {
return false;
}
this.#cnpj = cnpj;
return true;
} else {
return false;
}
}
O método realiza uma validação antes de armazenar o CNPJ.
Primeiro, verifica se algum valor foi informado. Em seguida, utiliza o operador de comparação < para rejeitar valores com menos de 18 caracteres.
Caso as validaƧƵes sejam atendidas, o valor Ʃ armazenado em #cnpj e o mƩtodo retorna true.
A verificação de tamanho utilizada neste exemplo é didÔtica e não corresponde a uma validação completa de CNPJ.
Linhas 24ā26 ā MĆ©todo getCNPJ()ā
getCNPJ() {
return this.#cnpj;
}
Retorna o CNPJ armazenado no atributo privado.
Linhas 28ā37 ā Sobrescrita de setEmail()ā
setEmail(email) {
if (email !== '') {
if (email.includes('@')) {
super.setEmail(email);
return true;
}
} else {
return false;
}
}
O mƩtodo setEmail() jƔ existe na superclasse Pessoa. Ao declarƔ-lo novamente em PJ, ocorre uma sobrescrita de mƩtodo.
A implementação acrescenta uma validação especĆfica:
- o valor não pode ser uma string vazia;
- o e-mail deve conter o caractere
@.
Quando as condições são atendidas, super.setEmail(email) reutiliza a implementação existente na superclasse.
Linhas 39ā48 ā MĆ©todo setIE()ā
setIE(ie) {
if (ie instanceof IE) {
this.#ie = ie;
ie.setPJ(this);
return true;
} else {
return false;
}
}
Estabelece o relacionamento 1:1 entre PJ e IE.
O operador instanceof garante que somente objetos da classe IE sejam associados.
Após a validação:
this.#ie = iearmazena a inscrição estadual na Pessoa JurĆdica;ie.setPJ(this)cria a referĆŖncia cruzada, fazendo com que a inscrição tambĆ©m conheƧa a Pessoa JurĆdica associada.
Linhas 50ā52 ā MĆ©todo getIE()ā
getIE() {
return this.#ie;
}
Retorna o objeto IE associado Ć Pessoa JurĆdica.
Linha 55 ā Exportaçãoā
module.exports = PJ;
Exporta a classe utilizando CommonJS, permitindo sua utilização em outros módulos.
š Conceitos-Chave Envolvidosā
| Conceito | Aplicação |
|---|---|
| HeranƧa | class PJ extends Pessoa |
| Encapsulamento | Uso dos atributos privados #cnpj e #ie |
| Sobrescrita | Redefinição de setEmail() |
super | Reutilização de Pessoa.setEmail() |
instanceof | Validação do objeto IE |
| Relacionamento 1:1 | Associação entre PJ e IE |
| ReferĆŖncia cruzada | ie.setPJ(this) |
| CommonJS | require() e module.exports |
š” Dicas do Professorā
instanceofvalida o tipo do objeto antes da associação.Essa estratĆ©gia reduz a possibilidade de relacionar objetos incompatĆveis.
Uma referĆŖncia cruzada permite navegar nos dois sentidos.
A partir de
PJ, podemos recuperar a inscrição estadual; a partir deIE, podemos recuperar a Pessoa JurĆdica associada.
Classe IE
A classe IE representa uma Inscrição Estadual e mantém informações como número, estado e data de registro.
AlĆ©m desses dados, o atributo #pj mantĆ©m a referĆŖncia para a Pessoa JurĆdica associada.
š» Código Completoā
Arquivo: /pessoas/IE/IEclss.js
class IE {
#numero;
#estado;
#dataRegistro;
#pj;
setNumero(numero) {
if (numero) {
this.#numero = numero;
return true;
} else {
return false;
}
}
getNumero() {
return this.#numero;
}
setEstado(estado) {
if (estado) {
this.#estado = estado;
return true;
} else {
return false;
}
}
getEstado() {
return this.#estado;
}
setDataRegistro(dataRegistro) {
if (dataRegistro instanceof Date) {
this.#dataRegistro = dataRegistro;
return true;
} else {
return false;
}
}
getDataRegistro() {
return this.#dataRegistro;
}
setPJ(pj) {
if (pj) {
this.#pj = pj;
return true;
} else {
return false;
}
}
getPJ() {
return this.#pj;
}
}
module.exports = IE;
š ComentĆ”rios e ExplicaƧƵes Linha a Linhaā
Linhas 01ā06 ā Classe e atributos privadosā
class IE {
#numero;
#estado;
#dataRegistro;
#pj;
Declara a classe IE e seus quatro atributos privados.
#pj Ć© responsĆ”vel por manter a referĆŖncia para a Pessoa JurĆdica relacionada.
Linhas 08ā16 ā MĆ©todos setNumero() e getNumero()ā
setNumero(numero) {
if (numero) {
this.#numero = numero;
return true;
} else {
return false;
}
}
getNumero() {
return this.#numero;
}
Permitem armazenar e recuperar o número da Inscrição Estadual.
Linhas 20ā31 ā MĆ©todos setEstado() e getEstado()ā
setEstado(estado) {
if (estado) {
this.#estado = estado;
return true;
} else {
return false;
}
}
getEstado() {
return this.#estado;
}
Permitem armazenar e recuperar o estado associado à inscrição.
Linhas 33ā44 ā Data de registroā
setDataRegistro(dataRegistro) {
if (dataRegistro instanceof Date) {
this.#dataRegistro = dataRegistro;
return true;
} else {
return false;
}
}
getDataRegistro() {
return this.#dataRegistro;
}
O mƩtodo setDataRegistro() utiliza instanceof Date para aceitar somente objetos da classe nativa Date.
Linhas 46ā57 ā Relacionamento com PJā
setPJ(pj) {
if (pj) {
this.#pj = pj;
return true;
} else {
return false;
}
}
getPJ() {
return this.#pj;
}
MantĆ©m a referĆŖncia para a Pessoa JurĆdica associada.
No fluxo utilizado neste capĆtulo, essa referĆŖncia Ć© preenchida automaticamente por PJ.setIE().
Linha 60 ā Exportaçãoā
module.exports = IE;
Exporta a classe IE utilizando CommonJS.
Simulando localStorage no Node.js
Nos navegadores, localStorage Ć© uma API utilizada para armazenar pares chaveāvalor localmente.
Em um ambiente Node.js puro, essa API nĆ£o estĆ” disponĆvel. Para permitir a experimentação dos conceitos de armazenamento, serĆ” utilizado um objeto que simula parte de seu comportamento.
A implementação apresentada é apenas uma simulação em memória. Os dados são perdidos quando a execução do programa termina.
š» Código Completoā
Arquivo: /pessoas/DAOs/localStorage.mjs
export const localStorage = {
store: {},
setItem(key, value) {
this.store[key] = value;
},
getItem(key) {
return this.store[key] || null;
},
removeItem(key) {
delete this.store[key];
},
clear() {
this.store = {};
}
};
š ComentĆ”rios e ExplicaƧƵes Linha a Linhaā
Linhas 01ā02 ā Objeto e armazenamento internoā
export const localStorage = {
store: {},
Cria e exporta um objeto chamado localStorage.
A propriedade store funciona como o armazenamento interno da simulação.
Linhas 04ā06 ā MĆ©todo setItem()ā
setItem(key, value) {
this.store[key] = value;
}
Armazena um valor utilizando uma chave.
Por exemplo:
localStorage.setItem('nome', 'Pedro');
Linhas 08ā10 ā MĆ©todo getItem()ā
getItem(key) {
return this.store[key] || null;
}
Recupera o valor associado Ć chave informada.
Caso a chave não exista, retorna null.
Linhas 12ā14 ā MĆ©todo removeItem()ā
removeItem(key) {
delete this.store[key];
}
Remove uma chave e o valor associado a ela.
Linhas 16ā18 ā MĆ©todo clear()ā
clear() {
this.store = {};
}
Remove todos os valores armazenados, substituindo store por um novo objeto vazio.
š Conceitos-Chave Envolvidosā
| Conceito | Explicação |
|---|---|
| Chaveāvalor | Cada informação Ć© armazenada utilizando uma chave |
| Objeto literal | A simulação é implementada diretamente com { } |
this | Permite acessar store a partir dos mƩtodos |
delete | Remove uma propriedade do objeto |
| ES Modules | export const realiza uma exportação nomeada |
| Volatilidade | Os dados permanecem somente durante a execução |
PadrĆ£o DAO ā PJDAO
AtĆ© este momento, a classe PJ concentra as regras relacionadas Ć Pessoa JurĆdica.
Entretanto, transformar o objeto para um formato adequado ao armazenamento e controlar sua persistência são responsabilidades diferentes.
Para separar essas responsabilidades, serÔ utilizada uma classe baseada no padrão DAO (Data Access Object).
Objeto PJ
ā
ā¼
PJDAO
ā
āāā toJSON()
ā
āāā saveJSON()
ā
āāā recoveryJSON()
ā
ā¼
localStorage
A DAO funcionarĆ” como uma camada intermediĆ”ria entre o objeto de domĆnio e o mecanismo de armazenamento.
š» Código Completoā
Arquivo: /pessoas/DAOs/PJDAO.mjs
import { localStorage } from './localStorage.mjs';
import PJ from '../PJ.js';
export default class PJDAO {
#pj;
constructor(pj) {
if (pj instanceof PJ) {
this.#pj = pj;
}
}
toJSON() {
let fones = [];
for (let fone of this.#pj.getTelefones()) {
fones.push({
ddd: fone.getDdd(),
numero: fone.getNumero()
});
}
return {
nome: this.#pj.getNome(),
email: this.#pj.getEmail(),
cnpj: this.#pj.getCNPJ(),
endereco: {
logradouro: this.#pj.getEndereco().getLogradouro(),
cep: this.#pj.getEndereco().getCep()
},
telefones: fones,
ie: {
numero: this.#pj.getIE().getNumero(),
estado: this.#pj.getIE().getEstado(),
dataRegistro: this.#pj.getIE().getDataRegistro()
}
};
}
saveJSON() {
localStorage.setItem('pj', JSON.stringify(this.toJSON()));
}
recoveryJSON() {
return JSON.parse(localStorage.getItem('pj'));
}
}
š ComentĆ”rios e ExplicaƧƵes Linha a Linhaā
Linhas 01ā02 ā ImportaƧƵesā
import { localStorage } from './localStorage.mjs';
import PJ from '../PJ.js';
A primeira instrução importa a simulação de localStorage.
A segunda importa a classe PJ, utilizada para validar o objeto recebido pela DAO.
Observe que localStorage é uma exportação nomeada, enquanto PJ é importada como exportação padrão na interoperabilidade utilizada pelo ambiente.
Linhas 04ā11 ā Classe, atributo e construtorā
export default class PJDAO {
#pj;
constructor(pj) {
if (pj instanceof PJ) {
this.#pj = pj;
}
}
Declara a classe PJDAO como exportação padrão.
O atributo #pj mantém a instância que serÔ manipulada pela DAO.
O construtor utiliza instanceof para garantir que somente objetos da classe PJ sejam armazenados.
Linhas 13ā23 ā Preparação dos telefonesā
toJSON() {
let fones = [];
for (let fone of this.#pj.getTelefones()) {
fones.push({
ddd: fone.getDdd(),
numero: fone.getNumero()
});
}
O mƩtodo toJSON() inicia criando um array vazio.
Em seguida, utiliza for...of para percorrer os objetos Telefone associados Ć Pessoa JurĆdica.
Para cada telefone é criado um objeto literal contendo apenas os dados que deverão fazer parte da representação serializÔvel.
Essa transformação é necessÔria porque os objetos da aplicação possuem métodos e atributos privados que não devem ser armazenados diretamente.
Linhas 25ā39 ā Construção da representação dos dadosā
return {
nome: this.#pj.getNome(),
email: this.#pj.getEmail(),
cnpj: this.#pj.getCNPJ(),
endereco: {
logradouro: this.#pj.getEndereco().getLogradouro(),
cep: this.#pj.getEndereco().getCep()
},
telefones: fones,
ie: {
numero: this.#pj.getIE().getNumero(),
estado: this.#pj.getIE().getEstado(),
dataRegistro: this.#pj.getIE().getDataRegistro()
}
};
O mĆ©todo retorna um objeto literal JavaScript contendo os dados relevantes da Pessoa JurĆdica e de seus objetos relacionados.
A estrutura possui objetos aninhados para representar:
- endereƧo;
- telefones;
- inscrição estadual.
à importante observar que toJSON() não gera uma string JSON. Ele prepara uma estrutura JavaScript adequada para ser posteriormente serializada.
Linhas 42ā44 ā MĆ©todo saveJSON()ā
saveJSON() {
localStorage.setItem('pj', JSON.stringify(this.toJSON()));
}
O mƩtodo realiza duas operaƧƵes.
Primeiro:
this.toJSON()
gera o objeto literal contendo os dados.
Depois:
JSON.stringify(...)
converte essa estrutura para uma string no formato JSON.
A string Ć© armazenada utilizando a chave 'pj'.
Linhas 46ā48 ā MĆ©todo recoveryJSON()ā
recoveryJSON() {
return JSON.parse(localStorage.getItem('pj'));
}
O processo inverso Ć© realizado utilizando JSON.parse().
Primeiro, getItem('pj') recupera a string armazenada. Depois, JSON.parse() converte a string novamente para uma estrutura JavaScript.
O resultado de
JSON.parse()contĆ©m os dados, mas nĆ£o recria automaticamente uma instĆ¢ncia da classePJ. MĆ©todos, atributos privados e protótipo da classe nĆ£o sĆ£o reconstruĆdos pela desserialização.
Objeto JavaScript Ć String JSONā
Essa distinção é fundamental.
const dados = pjdao.toJSON();
Nesse caso, dados Ć© um objeto JavaScript.
JĆ”:
const texto = JSON.stringify(dados);
produz uma string JSON.
O processo pode ser representado assim:
Objeto PJ
ā
ā toJSON()
ā¼
Objeto Literal JavaScript
ā
ā JSON.stringify()
ā¼
String JSON
ā
ā armazenamento
ā¼
localStorage
ā
ā JSON.parse()
ā¼
Objeto Literal JavaScript
š Conceitos-Chave Envolvidosā
| Conceito | Explicação |
|---|---|
| DAO | Camada responsÔvel pelo acesso e transformação dos dados |
toJSON() | Prepara uma representação serializÔvel do objeto |
JSON.stringify() | Converte objeto/valor JavaScript em string JSON |
JSON.parse() | Converte uma string JSON em valor JavaScript |
| Serialização | Transformação dos dados para um formato adequado ao armazenamento |
| Desserialização | Recuperação dos dados a partir da representação armazenada |
instanceof | Valida a instância recebida pela DAO |
| Objeto aninhado | Permite representar estruturas relacionadas |
for...of | Percorre os objetos Telefone |
| Separação de responsabilidades | A DAO trata armazenamento sem transferir essa responsabilidade para PJ |
š” Dicas do Professorā
toJSON()eJSON.stringify()não são a mesma operação.Neste exemplo,
toJSON()constrói um objeto literal.JSON.stringify()é que transforma esse objeto em texto JSON.
JSON armazena dados, não comportamento.
MƩtodos como
setNome(),getCNPJ()esetIE()não fazem parte da string JSON.
A recuperação não recria automaticamente o objeto original.
Depois de
JSON.parse(), temos uma estrutura contendo dados. Para obter novamente uma instĆ¢ncia completa dePJ, seria necessĆ”rio reconstruĆ-la.
Utilizando a DAO ā usaPJDAO.mjs
O arquivo usaPJDAO.mjs integra os objetos estudados e demonstra o fluxo completo:
Criar PJ
ā
Criar EndereƧo
ā
Criar Telefones
ā
Criar IE
ā
Estabelecer Relacionamentos
ā
Criar PJDAO
ā
Converter para estrutura serializƔvel
ā
Salvar
ā
Recuperar
š» Código Completoā
Arquivo: usaPJDAO.mjs
import PJ from './pessoas/PJ.js';
import PJDAO from './pessoas/DAOs/PJDAO.mjs';
import Endereco from './pessoas/Endereco.js';
import Telefone from './pessoas/Telefone.js';
import IE from './pessoas/IE/IEclss.js';
const pj = new PJ();
pj.setNome('Pedro');
pj.setEmail('pedro@ifb.edu.br');
pj.setCNPJ('1234567890/0001-99');
const end = new Endereco();
end.setLogradouro('QNM 40');
end.setCep('12345-678');
pj.setEndereco(end);
const fone1 = new Telefone();
fone1.setDdd('61');
fone1.setNumero('99999-8888');
pj.addTelefone(fone1);
const fone2 = new Telefone();
fone2.setDdd('62');
fone2.setNumero('99999-7777');
pj.addTelefone(fone2);
const ie = new IE();
ie.setNumero('123456');
ie.setEstado('SP');
ie.setDataRegistro(new Date());
pj.setIE(ie);
const pjdao = new PJDAO(pj);
const dados = pjdao.toJSON();
pjdao.saveJSON();
console.log(dados);
console.log(JSON.stringify(dados));
console.log(pjdao.recoveryJSON());
š ComentĆ”rios e ExplicaƧƵes Linha a Linhaā
Linhas 01ā05 ā ImportaƧƵesā
import PJ from './pessoas/PJ.js';
import PJDAO from './pessoas/DAOs/PJDAO.mjs';
import Endereco from './pessoas/Endereco.js';
import Telefone from './pessoas/Telefone.js';
import IE from './pessoas/IE/IEclss.js';
Importam todas as estruturas necessƔrias para o exemplo.
Linhas 07ā11 ā Criação da Pessoa JurĆdicaā
const pj = new PJ();
pj.setNome('Pedro');
pj.setEmail('pedro@ifb.edu.br');
pj.setCNPJ('1234567890/0001-99');
Cria a instância de PJ e configura seus dados bÔsicos.
Os mƩtodos herdados e sobrescritos continuam sendo utilizados normalmente.
Linhas 13ā19 ā EndereƧoā
const end = new Endereco();
end.setLogradouro('QNM 40');
end.setCep('12345-678');
pj.setEndereco(end);
Cria um objeto Endereco, configura seus dados e o associa Ć Pessoa JurĆdica.
Linhas 21ā27 ā Primeiro telefoneā
const fone1 = new Telefone();
fone1.setDdd('61');
fone1.setNumero('99999-8888');
pj.addTelefone(fone1);
Cria e configura o primeiro telefone e o adiciona Ć coleção de telefones da Pessoa JurĆdica.
Linhas 29ā35 ā Segundo telefoneā
const fone2 = new Telefone();
fone2.setDdd('62');
fone2.setNumero('99999-7777');
pj.addTelefone(fone2);
Repete o processo para um segundo telefone, demonstrando que a Pessoa JurĆdica pode manter uma coleção de objetos Telefone.
Linhas 37ā43 ā Inscrição Estadualā
const ie = new IE();
ie.setNumero('123456');
ie.setEstado('SP');
ie.setDataRegistro(new Date());
pj.setIE(ie);
Cria e configura a Inscrição Estadual.
new Date() cria um objeto com a data e hora atuais.
Ao executar pj.setIE(ie), Ć© estabelecido o relacionamento entre os dois objetos.
Linhas 45ā51 ā DAO, transformação e armazenamentoā
const pjdao = new PJDAO(pj);
const dados = pjdao.toJSON();
pjdao.saveJSON();
Cria a DAO associada Ć Pessoa JurĆdica.
toJSON() gera a estrutura serializƔvel e saveJSON() transforma essa estrutura em uma string JSON antes de armazenƔ-la.
Linhas 53ā55 ā Visualização dos resultadosā
console.log(dados);
console.log(JSON.stringify(dados));
console.log(pjdao.recoveryJSON());
As três instruções permitem comparar:
- o objeto literal produzido por
toJSON(); - a string JSON produzida por
JSON.stringify(); - os dados recuperados do armazenamento e convertidos novamente por
JSON.parse().
Comparando as Estruturas
| Estrutura | Papel |
|---|---|
PJ | Representa a Pessoa JurĆdica e suas regras |
IE | Representa a Inscrição Estadual |
localStorage | Simula um mecanismo de armazenamento chaveāvalor |
PJDAO | Faz a transformação e o acesso aos dados armazenados |
usaPJDAO.mjs | Integra e demonstra o funcionamento das estruturas |
Serialização e Persistência
Ć importante diferenciar os dois conceitos.
Serialização é a transformação dos dados para uma representação que possa ser armazenada ou transmitida.
Neste exemplo:
JSON.stringify(this.toJSON())
realiza a serialização para JSON.
JÔ persistência refere-se à capacidade de manter dados para utilização posterior.
A simulação de localStorage apresentada neste capĆtulo mantĆ©m os dados somente em memória. Portanto, ela permite estudar a interface de armazenamento, mas nĆ£o representa persistĆŖncia permanente: ao encerrar a execução, os dados sĆ£o perdidos.
Em um navegador, o localStorage real possui comportamento diferente e pode manter os dados entre sessões, conforme as regras do navegador e da origem da aplicação.
š Conceitos-Chave do CapĆtulo
| Conceito | Aplicação |
|---|---|
| HeranƧa | PJ especializa Pessoa |
| Encapsulamento | Uso de atributos privados |
| Sobrescrita | PJ.setEmail() |
| Polimorfismo | Reutilização de super.setEmail() |
| Relacionamento 1:1 | PJ ā IE |
| ReferĆŖncia cruzada | Objetos relacionados mantĆŖm referĆŖncias entre si |
instanceof | Validação de objetos |
| DAO | Separação da lógica de acesso aos dados |
| Objeto literal | Estrutura criada por toJSON() |
| JSON | Formato textual para representação de dados |
JSON.stringify() | Serialização |
JSON.parse() | Desserialização |
localStorage | Armazenamento chaveāvalor no navegador |
| ES Modules | import e export |
| CommonJS | require() e module.exports |
for...of | Percorre a coleção de telefones |
š” Resumo Final
Neste capĆtulo, a classe PJ foi ampliada para se relacionar com uma Inscrição Estadual por meio de uma associação 1:1. O relacionamento utiliza instanceof para validar o objeto e uma referĆŖncia cruzada para permitir a navegação entre os objetos relacionados.
Em seguida, foi apresentada uma simulação de localStorage, permitindo compreender operaƧƵes de armazenamento chaveāvalor mesmo em um ambiente Node.js.
A classe PJDAO introduziu o padrĆ£o Data Access Object, separando da classe de domĆnio as responsabilidades relacionadas Ć preparação, serialização, armazenamento e recuperação dos dados.
O mĆ©todo toJSON() foi utilizado para construir uma representação dos dados da Pessoa JurĆdica por meio de objetos literais. JSON.stringify() transformou essa estrutura em uma string JSON, enquanto JSON.parse() realizou o processo inverso.
Por fim, o arquivo usaPJDAO.mjs integrou todas as estruturas, demonstrando o fluxo completo entre objetos da aplicação, DAO, serialização e armazenamento.
š O que vocĆŖ aprendeu
Ao concluir este capĆtulo, vocĆŖ deverĆ” ser capaz de:
- compreender o relacionamento 1:1 entre objetos;
- implementar referĆŖncias cruzadas;
- validar associaƧƵes utilizando
instanceof; - compreender o papel de uma classe DAO;
- separar regras de domĆnio de responsabilidades de armazenamento;
- construir representaƧƵes serializƔveis de objetos;
- diferenciar objeto literal JavaScript de string JSON;
- utilizar
JSON.stringify()para serialização; - utilizar
JSON.parse()para desserialização; - compreender que JSON representa dados, e não métodos;
- compreender o funcionamento bƔsico de
localStorage; - diferenciar armazenamento em memória de persistência;
- utilizar
for...ofpara transformar coleções de objetos; - integrar módulos CommonJS e ES Modules em exemplos de aplicação.