Objetos y estructuras de datos
Usar getters y setters
El uso de getters y setters para acceder a datos en objetos es preferible al acceso directo a propiedades. "¿Por qué?" podrías preguntar. Aquí presentamos una lista desorganizada de razones:
- Cuando requieres funcionalidades adicionales al obtener propiedades, evitamos buscar y modificar cada acceso en la base de código.
- Simplifica la implementación de validaciones durante operaciones
set. - Encapsula la representación interna de los datos.
- Facilita la incorporación de registro de actividades y manejo de errores en operaciones de acceso y modificación.
- Permite carga perezosa de propiedades, como obtenerlas desde un servidor bajo demanda.
Incorrecto:
javascript
function makeBankAccount() {
// ...
return {
balance: 0
// ...
};
}
const account = makeBankAccount();
account.balance = 100;Correcto:
javascript
function makeBankAccount() {
// this one is private
let balance = 0;
// a "getter", made public via the returned object below
function getBalance() {
return balance;
}
// a "setter", made public via the returned object below
function setBalance(amount) {
// ... validate before updating the balance
balance = amount;
}
return {
// ...
getBalance,
setBalance
};
}
const account = makeBankAccount();
account.setBalance(100);Hacer que los objetos tengan miembros privados
Esto puede lograrse mediante closures (para ES5 y versiones anteriores).
Incorrecto:
javascript
const Employee = function(name) {
this.name = name;
};
Employee.prototype.getName = function getName() {
return this.name;
};
const employee = new Employee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: undefinedCorrecto:
javascript
function makeEmployee(name) {
return {
getName() {
return name;
}
};
}
const employee = makeEmployee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe