Visão Geral do Módulo
Neste módulo, você aprenderá os conceitos fundamentais da Programação Orientada a Objetos (POO) aplicados ao JavaScript. Vamos explorar como criar e utilizar classes e objetos para representar as entidades do nosso Sistema de Vendas (como `Cliente`, `Produto`, `Pedido`), além de entender herança, polimorfismo e encapsulamento no contexto do JavaScript.
Conteúdo Programático
1. Introdução à Orientação a Objetos
- O que é Programação Orientada a Objetos (POO)
- Paradigmas de programação: imperativo vs. orientado a objetos
- Benefícios: Reutilização, Manutenibilidade, Organização
- Conceitos chave: Classes, Objetos, Atributos, Métodos
- JavaScript como linguagem multi-paradigma (funcional, OO, procedural)
2. Objetos em JavaScript
- Revisão de objetos literais: Representando um produto ou cliente
- Propriedades (Ex: `nome_cliente`, `val_unit`) e Métodos (Ex: `calcularSubtotal()`)
- Acessando e modificando propriedades (dot notation, bracket notation)
- O `this` em métodos de objetos
- Object.create() e a cadeia de protótipos
- Desestruturação de objetos para acessar dados (Ex: `const { nome_cliente, cidade } = cliente;`)
3. Princípios da Orientação a Objetos
- Encapsulamento: Ocultar detalhes internos e expor apenas o necessário (Ex: Saldo de estoque só pode ser alterado por métodos específicos).
- Herança: Criar novas classes baseadas em existentes (Ex: `ClientePessoaFisica` e `ClientePessoaJuridica` herdando de `Cliente` - conceitual, não no script).
- Polimorfismo: Objetos de diferentes classes respondendo à mesma mensagem (Ex: Método `gerarRelatorio()` em `Pedido` e `Vendedor`).
- Abstração: Focar nos aspectos essenciais, ignorando detalhes irrelevantes (Ex: A classe `Produto` abstrai os detalhes de armazenamento físico).
- Associação, agregação e composição (Ex: `Pedido` *contém* `ItemPedido` - composição).
4. Funções Construtoras e Protótipos (Forma Clássica)
- Criando "moldes" com funções construtoras (Ex: `function Cliente(...)`)
- Operador `new` para criar instâncias (objetos)
- A propriedade `prototype` para adicionar métodos compartilhados
- Herança baseada em protótipos (`Object.setPrototypeOf` ou `Object.create`)
5. Classes em JavaScript (ES6+)
- Sintaxe moderna com a palavra-chave `class`
- Método `constructor` para inicializar objetos
- Definição de métodos diretamente na classe
- Métodos e propriedades estáticas (pertencem à classe, não à instância)
- Getters e setters para controlar acesso a propriedades
6. Herança com Classes
- Palavra-chave `extends` para criar subclasses
- Método `super()` para chamar o construtor da classe pai
- Sobrescrita de métodos da classe pai
- Exemplo conceitual: `PedidoOnline extends Pedido` (não aplicável diretamente ao script)
- Composição como alternativa à herança em muitos casos
7. Encapsulamento e Modificadores de Acesso
- Conceito de proteger dados internos
- Convenção com underscore (`_propriedade`)
- Campos privados com `#` (hash) - sintaxe mais recente
- Getters e Setters para acesso controlado
8. Polimorfismo em JavaScript
- Conceito: "Muitas formas" - objetos diferentes respondendo à mesma mensagem.
- Polimorfismo de subtipo (via herança e sobrescrita).
- Polimorfismo Ad-hoc (Duck Typing - "Se anda como um pato e grasna como um pato...").
- Exemplo: Uma função `imprimirDetalhes` que funciona para `Cliente` e `Vendedor`.
Objetivos de Aprendizagem
Ao final deste módulo, você será capaz de:
- Explicar os princípios fundamentais da Programação Orientada a Objetos.
- Criar e utilizar objetos literais e funções construtoras em JavaScript.
- Implementar classes, construtores, métodos e propriedades no ES6+.
- Aplicar herança para criar hierarquias de classes.
- Utilizar encapsulamento para proteger dados internos dos objetos.
- Implementar polimorfismo em JavaScript.
- Reconhecer e aplicar padrões de projeto comuns.
- Modelar entidades de um sistema real (como o Sistema de Vendas) usando POO em JavaScript.
Próximo Módulo
Avance para o próximo módulo e aprenda sobre Padrões de Desenvolvimento de Software.