Da trilha de JavaScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

JavaScript POO Intermediário

Classes

Em JavaScript, classes são uma forma de criar objetos com propriedades e métodos compartilhados, usando a sintaxe class. Elas são açúcar sintático sobre funções construtoras e herança prototípica, mas trazem uma estrutura mais clara e organizada para programação orientada a objetos.

O método especial constructor é chamado ao criar uma instância com new e serve para inicializar as propriedades. Dentro da classe, podemos definir métodos (funções) e getters (acessores) que permitem ler valores calculados ou controlar o acesso a propriedades.

A herança é feita com extends, e a palavra-chave super permite chamar o construtor ou métodos da classe pai. Isso facilita a reutilização de código e a criação de hierarquias de classes.

Para encapsulamento real, o JavaScript moderno oferece campos privados com #. Eles só podem ser acessados dentro da própria classe, garantindo que detalhes internos não sejam modificados externamente.

Pontos-chave

  • constructor é chamado automaticamente ao instanciar com new e define as propriedades iniciais.
  • Métodos são funções da classe; getters usam get e são acessados como propriedades.
  • extends cria uma subclasse; super chama o construtor ou métodos da classe pai.
  • Campos privados com # só são acessíveis dentro da própria classe.
  • Classes não sofrem hoisting: devem ser declaradas antes do uso.
classes.js
// Exemplo completo de classes em JavaScript
class Animal {
  #nome; // campo privado

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

  get nome() {
    return this.#nome;
  }

  falar() {
    return `${this.#nome} faz um som.`;
  }
}

class Cachorro extends Animal {
  constructor(nome, raca) {
    super(nome); // chama o construtor da classe pai
    this.raca = raca;
  }

  falar() {
    return `${this.nome} late!`; // usa getter da classe pai
  }

  get descricao() {
    return `${this.nome} é um ${this.raca}.`;
  }
}

const rex = new Cachorro('Rex', 'Labrador');
console.log(rex.falar());      // Rex late!
console.log(rex.descricao);    // Rex é um Labrador.
console.log(rex.nome);         // Rex
// console.log(rex.#nome);     // Erro: campo privado não acessível fora da classe

Exercícios

  1. 1
    Fácil

    Criando uma classe Pessoa

    Crie uma classe Pessoa com um construtor que recebe nome e idade. Adicione um método apresentar() que retorna "Olá, meu nome é [nome] e tenho [idade] anos.". Use um campo privado #nome e um getter nome para acessá-lo.

    Resolver
  2. 2
    Médio

    Herança com Funcionário e Gerente

    Crie uma classe Funcionario com campos privados #nome e #salario, um construtor que os inicializa, um getter salario e um método aumentarSalario(percentual) que aumenta o salário em percentual%. Em seguida, crie a classe Gerente que estende Funcionario e adiciona um campo privado #departamento. O construtor de Gerente deve chamar super e inicializar #departamento. Adicione um getter departamento. Instancie um Gerente, aumente seu salário em 10% e exiba nome, salário e departamento.

    Resolver
  3. 3
    Desafio

    Sistema de Formas Geométricas

    Crie uma classe abstrata Forma com um campo privado #nome e um método area() que lança um erro 'Método area() deve ser implementado'. Adicione um getter nome. Em seguida, crie as classes Circulo e Retangulo que estendem Forma. Circulo recebe raio e implementa area() retornando π * raio². Retangulo recebe largura e altura e implementa area() retornando largura * altura. Ambas devem chamar super com o nome da forma. Crie uma função imprimirArea(forma) que recebe uma forma e imprime "A área do [nome] é [area]". Instancie um círculo de raio 3 e um retângulo de 4x5, e chame imprimirArea para cada um.

    Resolver

Continue estudando