Encapsulamento

Encapsulamento é um dos princípios fundamentais da programação orientada a objetos. Refere-se à ideia de que os dados (geralmente variáveis) dentro de um objeto devem ser protegidos e acessados apenas através de métodos de um objeto. Em JavaScript, o encapsulamento pode ser alcançado usando funções construtoras e closures.

Aqui está um exemplo de encapsulamento em JavaScript:

function ContaBancaria(saldoInicial) {
    var saldo = saldoInicial; // Variável privada, encapsulada dentro do construtor

    this.getSaldo = function() {
        return saldo;
    };

    this.depositar = function(valor) {
        saldo += valor;
        console.log("Depósito de " + valor + " feito. Novo saldo: " + saldo);
    };

    this.sacar = function(valor) {
        if (saldo >= valor) {
            saldo -= valor;
            console.log("Saque de " + valor + " feito. Novo saldo: " + saldo);
        } else {
            console.log("Saldo insuficiente para saque.");
        }
    };
}

var minhaConta = new ContaBancaria(1000);
minhaConta.depositar(500); // Saída: Depósito de 500 feito. Novo saldo: 1500
minhaConta.sacar(200);     // Saída: Saque de 200 feito. Novo saldo: 1300

console.log(minhaConta.saldo); // Saída: undefined (não pode acessar saldo diretamente)
console.log(minhaConta.getSaldo()); // Saída: 1300 (usando o método getSaldo para acessar o saldo)

Neste exemplo, saldo é uma variável privada que só pode ser acessada pelos métodos dentro da função ContaBancaria. Esses métodos (getSaldo, depositar e sacar) são públicos e acessíveis a partir de fora do objeto. Dessa forma, o saldo é encapsulado e protegido de acesso direto.

Encapsulamento é útil porque permite controlar como os dados são acessados e modificados, proporcionando maior segurança e flexibilidade no seu código.