Encapsulamento de Propriedades: Getters e Setters - JavaScript
Encapsulamento é um dos conceitos-chave da programação orientada a objetos e envolve esconder o estado de um objeto para evitar acesso direto externo, a fim de manter a integridade dos dados. Por padrão, todas as propriedades dos objetos são públicas e acessíveis, e podemos acessá-las de qualquer lugar no programa.
function User(uName, uAge) {
this.name = uName;
this.age = uAge;
this.print = function() {
console.log(`Name: ${this.name} Age: ${this.age}`);
};
}
const tom = new User("Tom", 39);
tom.age = 11500;
tom.print(); // Name: Tom Age: 11500
No entanto, esse método de acesso pode ser indesejável. Por exemplo, na situação acima, a propriedade age
Mas podemos esconder isso de acesso externo. Para isso, a propriedade é definida como uma variável local/constante:
function User(uName, uAge) {
this.name = uName;
let _age = uAge;
this.print = function() {
console.log(`Name: ${this.name} Age: ${_age}`);
};
}
const tom = new User("Tom", 39);
tom._age = 11500;
tom.print(); // Name: Tom Age: 39
No construtor do User
_age
age
let _age = uAge;
Geralmente, os nomes das variáveis locais em construtores começam com um sublinhado. Embora essa variável também possa receber dados dos parâmetros do construtor e ser usada em funções dentro do construtor, não é possível acessá-la de fora:
tom._age = 11500;
Aqui, para o objeto tom
_age
_age
print
Getters e Setters
Como vimos, escondemos o valor da idade na variável local _age
function User(uName, uAge) {
this.name = uName;
let _age = uAge;
// getter - retorna o valor da variável
this.getAge = function() {
return _age;
}
// setter - define o valor da variável
this.setAge = function(age) {
if(age > 0 && age < 110){ // se a idade for maior que 0 e menor que 110
_age = age;
} else {
console.log("Valor inválido");
}
}
this.print = function(){
console.log(`Name: ${this.name} Age: ${_age}`);
};
}
const tom = new User("Tom", 39);
// obtém o valor
console.log(tom.getAge()) // 39
// define um novo valor
tom.setAge(22);
console.log(tom.getAge()) // 22
tom.setAge(11500); // Valor inválido
console.log(tom.getAge()) // 22
Para trabalhar com a idade do usuário externamente, são definidos dois métodos. O método getAge()
_age
setAge
_age
A vantagem dessa abordagem é que temos maior controle sobre o acesso ao valor de _age
Vale destacar que o JavaScript também oferece construções especiais para a criação de getters e setters: get
set