Getters e setters delle classi in JavaScript

In JavaScript, le classi offrono un modo per definire strutture dati complesse e il loro comportamento associato. Tuttavia, a volte è necessario controllare l'accesso alle proprietà di una classe, consentendo solo operazioni specifiche. Per farlo, JavaScript fornisce i getters e i setters.

L'uso di getter e setter offre diversi vantaggi:

  • Controllo dell'accesso: possiamo controllare l'accesso alle proprietà private, permettendo solo operazioni valide.
  • Validazione dei dati: possiamo eseguire controlli o operazioni speciali quando si impostano o si ottengono i valori delle proprietà.
  • Compatibilità con versioni precedenti: se in futuro dobbiamo apportare modifiche alla gestione delle proprietà, possiamo farlo senza influire sugli utenti che utilizzano la nostra classe.

Cos’è un Getter?

Un getter è un metodo all'interno di una classe che viene utilizzato per ottenere il valore di una proprietà privata. I getter vengono definiti utilizzando la parola chiave get seguita dal nome del metodo. Ecco un esempio:

class Cerchio {
	constructor(raggio) {
		this._raggio = raggio; // Proprietà privata
	}

	get area() {
		return Math.PI * this._raggio * this._raggio;
	}
}

Nell'esempio sopra, abbiamo una classe Cerchio con una proprietà privata _raggio e un getter area. Il getter area ci consente di ottenere l'area del cerchio in base al raggio.

Cos’è un Setter?

Un setter è un metodo utilizzato per impostare il valore di una proprietà privata all'interno di una classe. I setter vengono definiti utilizzando la parola chiave set seguita dal nome del metodo. Ecco un esempio:

class Temperatura {
	constructor(celsius) {
		this._celsius = celsius; // Proprietà privata
	}

	get fahrenheit() {
		return (this._celsius * 9/5) + 32;
	}

	set fahrenheit(valore) {
		this._celsius = (valore - 32) * 5/9;
	}
}

Nell'esempio sopra, abbiamo una classe Temperatura con una proprietà privata _celsius, un getter fahrenheit, e un setter fahrenheit. Il setter fahrenheit ci consente di impostare la temperatura in gradi Fahrenheit e calcolare automaticamente il valore equivalente in gradi Celsius.

Esempio di utilizzo di getters e setters

Ora che abbiamo definito getter e setter, vediamo come usarli:

class Cerchio {
	constructor(raggio) {
		this._raggio = raggio; // Proprietà privata
	}

	get area() {
		return Math.PI * this._raggio * this._raggio;
	}
}

class Temperatura {
	constructor(celsius) {
		this._celsius = celsius; // Proprietà privata
	}

	get fahrenheit() {
		return (this._celsius * 9/5) + 32;
	}

	set fahrenheit(valore) {
		this._celsius = (valore - 32) * 5/9;
	}
}

const mioCerchio = new Cerchio(5);
console.log(mioCerchio.area); // Output: 78.53981633974483

const miaTemperatura = new Temperatura(22);
console.log(miaTemperatura.fahrenheit); // Output: 71.6

miaTemperatura.fahrenheit = 80;
console.log(miaTemperatura.fahrenheit); // Output: 80
console.log(miaTemperatura._celsius); // Output: 26.666666666666668