Skip to content

Instantly share code, notes, and snippets.

@Fraitz
Last active April 24, 2022 16:47
Show Gist options
  • Save Fraitz/3815bc1c688ecdab7082f2f2baae4636 to your computer and use it in GitHub Desktop.
Save Fraitz/3815bc1c688ecdab7082f2f2baae4636 to your computer and use it in GitHub Desktop.
Resumo de estudos de POO com JavaScript e TypeScript

Classes e Instâncias

Classe é a criação de um objeto e com new ClassName eu instancio uma classe, por ex:

// Aqui eu crio a classe Book
class Book {
  id: string,
  titulo: string;
  precoVenda: number;
  custo: number;

  // O constructor me permite criar a classe já passando os parâmetros desta class
  constructor(id: string, titulo: string, precoVenda: number, custo: number) {
    this.id = id;
    this.titulo = titulo;
    this.precoVenda= precoVenda;
    this.custo = custo;
  }
}

// Aqui eu crio uma instância da classe Book com os seguintes parâmetros:
const book1 = new Book('0001', 'Sapiens', 50.00, 38.00);
  • IMPORTANTE Nas classes na horas de criar variáveis, parâmetros ou funções não é necessário utilizar os nomes const e function

Atributos privados, getters e setters

/* Se eu quero que uma classe tenha propriedades privadas,
 eu estou dizendo que quero que essas propriedades não possam ser acessadas ou 
alteradas livremente sem restrições */

 // Para isso eu posso definir como 'private' e dou o nome com underline;
class Book {
  private _id: string,
  private _titulo: string;
  private _precoVenda: number;
  private _custo: number;

  constructor(id: string, titulo: string, precoVenda: number, custo: number) {
    this._id = id;
    this._titulo = titulo;
    this._precoVenda= precoVenda;
    this._custo = custo;
  }
	
  // Para acessar um parâmetro privado eu utilizo o metodo 'get'
  get id() {
    return this._id;
  }

  get _titulo() {
    return this._id;
  }

  get _precoVenda() {
    return this._id;
  }

  get _custo() {
    return this._id;
  }

  // Para alterar eu utilizo o metodo 'set'
  set precoVenda(price: number){
    this._precoVenda = price;
  }
}

const book1 = new Book('0001', 'Sapiens', 50.00, 38.00);

// Agora eu consigo acessar todas as propriedades e alterar o precoVenda

book1.precoVenda = 52.00;

// Se eu quiser validar o precoVenda posso colocar a seguinte funcao:

set precoVenda(price: number) {
  if(price < this._custo) {
    console.error('Preço não pode ser menor que custo');
  } else {
    this._precoVenda = price;
  }
}

/* Posso ter uma propriedade que não está associada a um atributo, por ex.
se eu quiser criar uma propriedade lucro posso declará-la com um get ou set */

get lucro(): number {
  return this._precoVenda - this._custo;
}

// para acessar posso acessar simplesmente assim:
book1.profit;
  • IMPORTANTE O nome dos getters e setters não precisa ser necessariamente o nome dos parâmetros, e o que eles fazem é retornar o que as suas respectivas funções nativas executam.
  • IMPORTANTE Se tenho um **GET** e um **SET** definindo, é uma propriedade, não necessariamente um atributo. Não preciso ter propriedades atreladas à atributos

Métodos de uma classe

/* Posso criar métodos dentro das classes, que nada mais são do que funções
dentro da classe com retornos personalizados */

// Por ex. calcular o lucro de um livro
public calculateProfit(): number {
  return this._precoVenda - this._custo;
}

// Ou então atualizar o preco de venda com base no lucro desejado
public setPrecoVendaMinimo(margemDeLucro: number): number {
  const novoPreco = this._custo * (1 + margemDeLucro/100);
  return this._precoVenda = novoPreco;
}

// Por exemplo, se quisermos ter uma venda 
book1.setPrecoVendaMinimo(30);

Parâmetros opcionais e obrigatórios

/* Quando quero determinar parâmetros opcionais com Typescript no constructor 
eu devo colocar as propriedades opcionais por último no constructor e além disso
devo implementar uma função de checagem para ela */

  constructor(id: string, titulo: string,  custo: number, precoVenda?: number) {
    this._id = id;
    this._titulo = titulo;
    if(precoVenda) {
      this._precoVenda = precoVenda;
    } else {
      this._precoVenda = custo;
    }
    this._custo = custo;
  }

O método nativo toString() de uma classe

/* Este método retorna uma representação, em string, da classe que o utiliza.
E podemos usar isso para retornar coisas como */

public toString(): string {
  return `Livro: ${this._titulo}, Preço: ${this._precoVenda}`
}

/* Para utilizar esse método da classe, utilizamos chamar a instância com 
string literals */
console.log(`${book1}`) 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment