Los métodos get y set son una sintaxis especial para declarar métodos que permiten declarar métodos que se usan con una sintaxis como variables.
Los métodos getter y setter son funciones cuya función principal es acceder a una propiedad de un objeto, pero realizando ciertas funciones destinadas a mantener el estado interno del objeto
La sintaxis de get
y set
permite definir métodos getter y setter de forma más cómoda, haciendo más sencilla la encapsulación y validación de datos dentro de una clase.
Si quieres aprender más puedes consultar
Métodos get
En términos generales, un método getter es una función especial que permite acceder a una propiedad de un objeto.
Si empleamos la palabra get
antes de un método, estamos indicando que queremos que esta sea un getter.
Ahora puedes obtener el valor de una función get
como si fuera una variable, pero internamente estás ejecutando un método cada vez que obtienes el valor.
Vamos a verlo con un ejemplo
class Persona {
#nombre;
#edad;
constructor(nombre, edad) {
this.#nombre = nombre; // Propiedad interna
this.#edad = edad; // Propiedad interna
}
get nombre() {
return this.#nombre; // Acceso controlado a la propiedad #nombre
}
get edad() {
return this.#edad; // Acceso controlado a la propiedad #edad
}
}
const persona1 = new Persona("Luis", 25);
console.log(persona1.nombre); // Llama al método get de nombre y muestra "Luis"
En el ejemplo anterior,
- El método
get nombre
permite acceder a la propiedad privada#nombre
de la clasePersona
de forma controlada. - Externamente se usa casi como si fuera una variable usando la notación punto, con
persona1.nombre
.
Métodos set
Por otro lado, un método setter es una función especial que permite asignar una propiedad de un objeto.
La principal ventaja de los métodos set
es que te permiten validar y modificar los valores antes de que sean asignados a las propiedades.
Vamos a verlo con un ejemplo sencillo
class Persona {
#nombre;
#edad;
constructor(nombre, edad) {
this.#nombre = nombre;
this.#edad = edad;
}
set nombre(nuevoNombre) {
if (nuevoNombre.length > 0) {
this.#nombre = nuevoNombre; // Validación antes de asignar el valor
} else {
console.log("El nombre no puede estar vacío");
}
}
set edad(nuevaEdad) {
if (nuevaEdad > 0) {
this.#edad = nuevaEdad; // Validación antes de asignar el valor
} else {
console.log("La edad debe ser un valor positivo");
}
}
}
const persona2 = new Persona("Luis", 30);
persona2.nombre = ""; // Intento de asignar un nombre vacío
persona2.edad = -5; // Intento de asignar una edad negativa
console.log(persona2.nombre); // Muestra "Luis" (no se cambió)
console.log(persona2.edad); // Muestra 30 (no se cambió)
En este ejemplo,
- Los métodos
set
paranombre
yedad
permiten realizar una validación antes de modificar las propiedades internas del objeto. - Si los valores no son válidos, el método
set
puede bloquear la asignación.
Ejemplos prácticos
Vamos a ver algunos ejemplos prácticos de cómo utilizar estos métodos en clases de JavaScript.
Controlando el acceso y modificación de datos
Imaginemos que estamos creando una clase llamada CuentaBancaria
, donde queremos controlar el acceso y la asignación del saldo.
Queremos permitir que el saldo sea accesible, pero solo modificable si la cantidad a retirar es válido (es decir, no superior al saldo actual).
class CuentaBancaria {
constructor(saldo) {
this._saldo = saldo;
}
// Método get para acceder al saldo
get saldo() {
return this._saldo;
}
// Método set para modificar el saldo
set saldo(nuevoSaldo) {
if (nuevoSaldo >= 0) {
this._saldo = nuevoSaldo;
} else {
console.log("El saldo no puede ser negativo");
}
}
// Método para realizar un retiro
retirar(cantidad) {
if (cantidad <= this._saldo) {
this._saldo -= cantidad;
console.log(`Retiro exitoso. Saldo restante: ${this._saldo}`);
} else {
console.log("Fondos insuficientes");
}
}
}
const cuenta = new CuentaBancaria(1000);
console.log(cuenta.saldo); // Acceso mediante el getter: 1000
cuenta.retirar(500); // Realiza un retiro válido
console.log(cuenta.saldo); // Saldo restante: 500
cuenta.saldo = -100; // Intenta asignar un saldo negativo
En este ejemplo:
get saldo()
: Permite acceder al saldo de la cuenta sin permitir que se modifique directamente desde fuera de la clase.set saldo()
: Permite asignar un nuevo saldo a la cuenta, pero valida que el valor no sea negativo.retirar(cantidad)
: Realiza una validación para asegurarse de que el cantidad del retiro no sea mayor al saldo disponible.
Propiedades calculadas
Un caso común es cuando queremos que una propiedad se calcule a partir de otras de otras (las llamamos propiedades computadas).
Por ejemplo, imaginemos una clase que calcula el área de un círculo a partir de su radio. Podemos usar un método get
para acceder al área, y un método set
para modificar el radio.
class Circulo {
#radio;
constructor(radio) {
this.#radio = radio;
}
// Método set para establecer el radio
set radio(nuevoRadio) {
if (nuevoRadio > 0) {
this.#radio = nuevoRadio;
} else {
console.log("El radio debe ser un valor positivo");
}
}
// Método get para calcular el área
get area() {
return Math.PI * this.#radio ** 2;
}
}
const circulo = new Circulo(5);
console.log(circulo.area); // Muestra el área (aproximadamente 78.54)
circulo.radio = 10; // Cambia el radio
console.log(circulo.area); // Muestra el nuevo área (aproximadamente 314.16)
Aquí,
- El método
get
paraarea
calcula dinámicamente el área a partir del valor actual delradio
. - No es necesario almacenar el área como una propiedad, ya que se calcula automáticamente (propiedad computada)