Skip to main content

šŸ“˜ 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 = ie armazena 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​

ConceitoAplicação
HeranƧaclass PJ extends Pessoa
EncapsulamentoUso dos atributos privados #cnpj e #ie
SobrescritaRedefinição de setEmail()
superReutilização de Pessoa.setEmail()
instanceofValidação do objeto IE
Relacionamento 1:1Associação entre PJ e IE
ReferĆŖncia cruzadaie.setPJ(this)
CommonJSrequire() e module.exports

šŸ’” Dicas do Professor​

instanceof valida 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 de IE, 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​

ConceitoExplicação
Chave–valorCada informação Ć© armazenada utilizando uma chave
Objeto literalA simulação é implementada diretamente com { }
thisPermite acessar store a partir dos mƩtodos
deleteRemove uma propriedade do objeto
ES Modulesexport const realiza uma exportação nomeada
VolatilidadeOs 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 classe PJ. 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​

ConceitoExplicação
DAOCamada 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çãoTransformação dos dados para um formato adequado ao armazenamento
DesserializaçãoRecuperação dos dados a partir da representação armazenada
instanceofValida a instância recebida pela DAO
Objeto aninhadoPermite representar estruturas relacionadas
for...ofPercorre os objetos Telefone
Separação de responsabilidadesA DAO trata armazenamento sem transferir essa responsabilidade para PJ

šŸ’” Dicas do Professor​

toJSON() e JSON.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() e setIE() 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 de PJ, 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:

  1. o objeto literal produzido por toJSON();
  2. a string JSON produzida por JSON.stringify();
  3. os dados recuperados do armazenamento e convertidos novamente por JSON.parse().

Comparando as Estruturas

EstruturaPapel
PJRepresenta a Pessoa JurĆ­dica e suas regras
IERepresenta a Inscrição Estadual
localStorageSimula um mecanismo de armazenamento chave–valor
PJDAOFaz a transformação e o acesso aos dados armazenados
usaPJDAO.mjsIntegra 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

ConceitoAplicação
HeranƧaPJ especializa Pessoa
EncapsulamentoUso de atributos privados
SobrescritaPJ.setEmail()
PolimorfismoReutilização de super.setEmail()
Relacionamento 1:1PJ ↔ IE
ReferĆŖncia cruzadaObjetos relacionados mantĆŖm referĆŖncias entre si
instanceofValidação de objetos
DAOSeparação da lógica de acesso aos dados
Objeto literalEstrutura criada por toJSON()
JSONFormato textual para representação de dados
JSON.stringify()Serialização
JSON.parse()Desserialização
localStorageArmazenamento chave–valor no navegador
ES Modulesimport e export
CommonJSrequire() e module.exports
for...ofPercorre 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...of para transformar coleƧƵes de objetos;
  • integrar módulos CommonJS e ES Modules em exemplos de aplicação.