Funcionalidades do Node.js/JavaScript
1. .bind
Cria uma nova função com o this fixado ao valor especificado.
function saudacao() {
console.log(`Olá, ${this.nome}`);
}
const pessoa = { nome: "Artur" };
const saudacaoPessoa = saudacao.bind(pessoa);
saudacaoPessoa(); // "Olá, Artur"
2. .call
Executa uma função, especificando o valor de this e argumentos individualmente.
function apresentar(cidade) {
console.log(`${this.nome} mora em ${cidade}`);
}
const pessoa = { nome: "Maria" };
apresentar.call(pessoa, "Recife"); // "Maria mora em Recife"
3. .apply
Parecido com .call, mas os argumentos são passados em array.
function somar(a, b) {
return a + b;
}
console.log(somar.apply(null, [5, 7])); // 12
4. Object.setPrototypeOf
Define o protótipo (herança) de um objeto.
const animal = {
falar() {
console.log("Som genérico");
}
};
const cachorro = { nome: "Rex" };
Object.setPrototypeOf(cachorro, animal);
cachorro.falar(); // "Som genérico"
5. class e new
Sintaxe de classe para criar objetos e instanciar com new.
class Pessoa {
constructor(nome) {
this.nome = nome;
}
}
const p1 = new Pessoa("Lucas");
console.log(p1.nome); // "Lucas"
6. Object.create()
Cria um novo objeto com o protótipo especificado.
const animal = {
tipo: "Mamífero"
};
const gato = Object.create(animal);
gato.nome = "Mingau";
console.log(gato.tipo); // "Mamífero"
7. Getters e Setters
Permitem acessar e modificar propriedades de forma controlada.
class Retangulo {
constructor(l, a) {
this.l = l;
this.a = a;
}
get area() {
return this.l * this.a;
}
set largura(valor) {
this.l = valor;
}
}
const r = new Retangulo(10, 5);
console.log(r.area); // 50
r.largura = 20;
console.log(r.area); // 100
8. Métodos Estáticos
Pertencem à classe, não à instância.
class Matematica {
static soma(a, b) {
return a + b;
}
}
console.log(Matematica.soma(5, 7)); // 12
9. Polimorfismo
Capacidade de métodos terem comportamentos diferentes em classes diferentes.
class Animal {
falar() {
console.log("Som genérico");
}
}
class Cachorro extends Animal {
falar() {
console.log("Au au");
}
}
class Gato extends Animal {
falar() {
console.log("Miau");
}
}
const animais = [new Cachorro(), new Gato()];
animais.forEach(a => a.falar());
// "Au au"
// "Miau"
10. Modificadores de Acesso (# e outros)
Em JavaScript moderno, o # é usado para criar campos privados em classes. Esses campos só podem ser acessados dentro da própria classe.
- Público (default): acessível de qualquer lugar.
- Privado (
#): acessível apenas dentro da classe. - Protegido (convenção
_): não existe nativamente, mas é usado como convenção para indicar que não deve ser acessado diretamente.
class ContaBancaria {
#saldo = 0; // campo privado
depositar(valor) {
this.#saldo += valor;
}
getSaldo() {
return this.#saldo;
}
}
const conta = new ContaBancaria();
conta.depositar(100);
console.log(conta.getSaldo()); // 100
console.log(conta.#saldo); // Erro: campo privado