Page cover

7.8.3 - Classes e Objetos

🧱 Programação Orientada a Objetos (POO) — O Poder de Organizar o Mundo com Código

🧱 Programação Orientada a Objetos (POO) — O Poder de Organizar o Mundo com Código

Você já imaginou programar como se estivesse organizando o mundo real em caixinhas lógicas? 📦 Pois é exatamente isso que a Programação Orientada a Objetos (POO) faz!


🧠 O que é Programação Orientada a Objetos?

POO é um modelo de programação que se baseia na ideia de que tudo pode ser representado como um objeto.

🎯 Objetos têm características (chamadas de propriedades) e ações (chamadas de métodos).


🧩 Conceitos Fundamentais

Conceito
O que é
Exemplo prático

Classe

Molde para criar objetos

Receita de bolo 🍰

Objeto

Instância de uma classe

Um bolo feito com a receita

Atributo

Característica do objeto

Cor, tamanho, nome

Método

Ação que o objeto pode realizar

Falar, andar, ligar

Abstração

Focar no essencial e esconder os detalhes

Você usa um celular sem saber como ele funciona por dentro 📱

Encapsulamento

Proteger os dados do objeto

Bloquear dados sensíveis com senha

Herança

Um objeto herda características de outro

Um cachorro é um animal 🐶

Polimorfismo

Objetos diferentes com comportamentos parecidos

Um gato e um cachorro podem "emitirSom()", mas cada um faz um som diferente 🐱🐶


💬 Por que usar POO?

  • 📦 Organiza melhor o código

  • 🔄 Facilita reaproveitamento de lógica

  • 🧼 Deixa o código mais limpo e fácil de manter

  • 🤝 Permite que times grandes trabalhem em conjunto

  • 🚀 Usado em praticamente todas as grandes aplicações do mundo real!


📌 Quando usar POO?

Use POO quando:

✅ Você precisa organizar dados complexos ✅ Existem muitas entidades com comportamentos semelhantes ✅ Seu projeto vai crescer e precisa ser escalável ✅ Você quer aplicar boas práticas e padrões modernos


🧑‍🍳 Exemplo com Pseudocódigo

classe Pessoa:
    atributo nome
    atributo idade

    método dizerOla():
        exibir("Olá, meu nome é " + nome)

objeto joao = novo Pessoa()
joao.nome = "João"
joao.idade = 25
joao.dizerOla()

🛠️ Aplicando POO em JavaScript

class Pessoa {
  constructor(nome, idade) {
    this.nome = nome;
    this.idade = idade;
  }

  dizerOla() {
    console.log(`Olá, meu nome é ${this.nome}`);
  }
}

const joao = new Pessoa("João", 25);
joao.dizerOla(); // Olá, meu nome é João

🎯 Observação Especial: Os 4 Pilares da Programação Orientada a Objetos com JavaScript

A Programação Orientada a Objetos tem 4 grandes pilares. Eles são como as colunas de sustentação de uma casa. Sem eles, a estrutura não para de pé! Vamos conhecer cada um com exemplos simples em JavaScript? 💡


🧠 1. Abstração

Abstrair é esconder os detalhes complexos e mostrar só o que importa. Como usar um carro sem saber como o motor funciona! 🚗

class ContaBancaria {
  constructor(saldoInicial) {
    this.saldo = saldoInicial;
  }

  depositar(valor) {
    this.saldo += valor;
  }

  verSaldo() {
    console.log(`Saldo atual: R$ ${this.saldo}`);
  }
}

const minhaConta = new ContaBancaria(100);
minhaConta.depositar(50);
minhaConta.verSaldo(); // Mostra apenas o que importa

📌 O usuário não precisa saber como o saldo é calculado, apenas que existe um método verSaldo().


🧱 2. Encapsulamento

Encapsular é proteger os dados, impedindo que algo externo interfira diretamente. É como uma cápsula 💊 que guarda o que está dentro.

class Usuario {
  #senha; // 🔒 Propriedade privada

  constructor(nome, senha) {
    this.nome = nome;
    this.#senha = senha;
  }

  autenticar(senhaDigitada) {
    return this.#senha === senhaDigitada;
  }
}

const user = new Usuario("Lucas", "1234");
console.log(user.autenticar("1234")); // true
console.log(user.senha); // undefined (não dá acesso direto!)

⚠️ O # torna a propriedade privada — ou seja, só a própria classe pode acessar.


🧬 3. Herança

Herança é quando uma classe "filha" herda características e comportamentos da classe "pai". Tipo: um cachorro é um animal 🐶.

class Animal {
  constructor(nome) {
    this.nome = nome;
  }

  emitirSom() {
    console.log("Som genérico...");
  }
}

class Cachorro extends Animal {
  emitirSom() {
    console.log("Au au!");
  }
}

const dog = new Cachorro("Bolt");
dog.emitirSom(); // Au au!

Cachorro herda de Animal, mas pode sobrescrever o comportamento se quiser.


🌀 4. Polimorfismo

Polimorfismo significa "muitas formas". Objetos diferentes podem usar o mesmo método, mas com comportamentos diferentes!

class Gato extends Animal {
  emitirSom() {
    console.log("Miau!");
  }
}

const animais = [new Cachorro("Bolt"), new Gato("Luna")];

animais.forEach((animal) => animal.emitirSom());
// Au au!
// Miau!

🎭 Cada objeto interpreta emitirSom() de um jeito, mesmo que o nome do método seja igual.


🧩 Resumo visual

Pilar
O que é
Palavra-chave
Exemplo

Abstração

Mostrar só o necessário

métodos públicos

verSaldo()

Encapsulamento

Proteger os dados

#propriedade

#senha

Herança

Reutilizar comportamentos

extends

class Gato extends Animal

Polimorfismo

Um mesmo método, vários resultados

método sobrescrito

emitirSom()


✅ Dominar esses pilares ajuda a escrever códigos mais limpos, organizados e profissionais — além de abrir portas para linguagens como Java, Python, C# e muitas outras!


🕰️ Por que a POO foi criada?

Lá pelos anos 80, programadores estavam sofrendo com códigos enormes e desorganizados 😵. Foi aí que surgiu a POO: como uma forma de quebrar o código em partes menores, reutilizáveis e mais próximas da lógica humana.


🚧 O que não é POO?

  • Código todo no mesmo arquivo sem organização

  • Funções soltas sem contexto de objetos

  • Variáveis globais espalhadas por tudo

  • Código repetido em várias partes do programa


🤔 Diferença entre POO no JS e em outras linguagens

Linguagem
Tipo
Característica

JavaScript

Baseada em protótipos

Objetos herdam de outros objetos diretamente

Java / C#

Baseadas em classes

Tudo parte de uma classe “clássica”

👉 Em JavaScript, POO é mais flexível e dinâmica, mas também mais fácil de cometer erros.


Embora o JavaScript permita usar Programação Orientada a Objetos, ele faz isso de uma forma um pouco diferente de linguagens como Java, Python ou C#. Vamos entender o que muda?

🔨 1. Construtores em JS não são obrigatórios e funcionam de forma especial

Em linguagens como Java, toda instância de classe precisa de um construtor explícito. No JavaScript, você pode usar uma função como construtor ou uma sintaxe moderna com class, mas por trás dos panos... tudo continua funcionando como funções e objetos! 😄

function Pessoa(nome) {
  this.nome = nome;
}
class Pessoa {
  constructor(nome) {
    this.nome = nome;
  }
}

Ambas as formas acima criam uma nova "Pessoa", mas a primeira é mais parecida com a raiz do JavaScript, e a segunda é só uma roupagem mais familiar para quem vem de outras linguagens.


🧬 2. Propriedades e métodos não são copiados — eles são herdados pelo protótipo!

JavaScript é uma linguagem baseada em protótipos (prototype-based), enquanto outras linguagens são baseadas em classes reais (class-based).

Em linguagens como Java ou Python, os métodos são copiados para cada instância da classe (salvo otimizações do compilador).

No JavaScript, as instâncias não recebem cópias dos métodos, elas apenas apontam para o protótipo onde os métodos estão definidos! 👇

function Pessoa(nome) {
  this.nome = nome;
}

Pessoa.prototype.dizerOla = function () {
  console.log("Olá, eu sou " + this.nome);
};

const joao = new Pessoa("João");
joao.dizerOla(); // funciona, mas o método está no prototype

📌 Ou seja:

  • No JavaScript, métodos vivem no protótipo do objeto.

  • Instâncias acessam esses métodos através da cadeia de protótipos (prototype chain).

  • Isso economiza memória e é muito flexível!


📚 Resumindo

Característica
JavaScript
Outras linguagens

Modelo

Baseado em protótipos

Baseado em classes

Construtor

Função ou classe (não obrigatório)

Obrigatório e bem definido

Métodos

Herança por prototype

Copiados ou herdados via classe

Herança

Por protótipo (__proto__)

Por classe (extends, super)

Flexibilidade

Alta (até demais 😅)

Mais rígida e controlada


💡 Dica de ouro: Entender os protótipos é o primeiro passo para se tornar um(a) verdadeiro(a) ninja em JavaScript! 🥷✨


🎭 Como POO atua no computador?

  1. 🧠 Você define classes (molde de objetos)

  2. 💾 O computador guarda isso na memória

  3. 🧱 Cada vez que você usa new, uma nova instância é criada

  4. 🔗 Essa instância herda métodos através da cadeia de protótipos

  5. ⚙️ Tudo fica organizado e reutilizável!


👍 Boas práticas

✅ Nomeie classes com letras maiúsculas (Pessoa, Carro) ✅ Cada classe deve ter um único propósito ✅ Prefira métodos pequenos e claros ✅ Use this com atenção ✅ Mantenha os dados encapsulados (escondidos) quando possível


⚠️ Erros comuns

❌ Criar muitos métodos dentro do constructor ❌ Acessar propriedades diretamente (sem método) ❌ Misturar responsabilidade (uma classe que faz “tudo”) ❌ Não reaproveitar código com herança ou composição ❌ Usar this fora de contexto (dentro de arrow functions, por exemplo)


💡 Exemplos do dia a dia

📱 Exemplo real

Um app de entrega:

  • Pedido (classe)

  • Cliente, Entregador, Restaurante (subclasses)

  • statusPedido(), calcularTaxaEntrega() (métodos)

⚠️ Exemplo de má prática

function Cliente(nome, idade) {
  this.nome = nome;
  this.idade = idade;
  this.comprar = function(produto) {
    console.log(this.nome + " comprou " + produto);
  };
}

👎 Método dentro do construtor → ocupa mais memória!

✅ Boa prática

Cliente.prototype.comprar = function(produto) {
  console.log(this.nome + " comprou " + produto);
};

🧭 Convenções de POO em JavaScript

  • Nome de classe: CamelCase com a primeira letra maiúscula → MinhaClasse

  • Nome de método/variável: camelCasefazerAlgo

  • this é usado para acessar dados da instância atual


🌱 O que dá pra criar com POO?

  • Jogos 🎮

  • Aplicações web e mobile 📱

  • APIs organizadas 🔗

  • Softwares grandes e escaláveis 💼

  • Componentes reutilizáveis (ex: bibliotecas!)


📚 Conclusão

A POO é como dar vida e lógica ao seu código. Ela te permite pensar como um designer de sistemas 🧑‍🔧 — criando coisas que se comunicam, interagem e evoluem.

E o melhor? Ela é usada em quase tudo no mundo da programação!

Last updated