Con l'aiuto di getter e setter , puoi definire una classe JavaScript che fa una cosa del genere.
Innanzitutto, definiamo la nostra classe chiamata MonitoredVariable
:
class MonitoredVariable {
constructor(initialValue) {
this._innerValue = initialValue;
this.beforeSet = (newValue, oldValue) => {};
this.beforeChange = (newValue, oldValue) => {};
this.afterChange = (newValue, oldValue) => {};
this.afterSet = (newValue, oldValue) => {};
}
set val(newValue) {
const oldValue = this._innerValue;
// newValue, oldValue may be the same
this.beforeSet(newValue, oldValue);
if (oldValue !== newValue) {
this.beforeChange(newValue, oldValue);
this._innerValue = newValue;
this.afterChange(newValue, oldValue);
}
// newValue, oldValue may be the same
this.afterSet(newValue, oldValue);
}
get val() {
return this._innerValue;
}
}
Supponiamo di voler ascoltare le money
modifiche, creiamo un'istanza di MonitoredVariable
con soldi iniziali 0
:
const money = new MonitoredVariable(0);
Quindi potremmo ottenere o impostare il suo valore usando money.val
:
console.log(money.val); // Get its value
money.val = 2; // Set its value
Dal momento che non abbiamo definito alcun listener per questo, non succede nulla di speciale dopo le money.val
modifiche a 2.
Ora definiamo alcuni ascoltatori. Abbiamo quattro ascoltatori disponibili: beforeSet
, beforeChange
, afterChange
, afterSet
. Quanto segue avverrà in sequenza quando si utilizzamoney.val = newValue
per modificare il valore della variabile:
- money.beforeSet (newValue, oldValue);
- money.beforeChange (newValue, oldValue); (Verrà ignorato se il suo valore non viene modificato)
- money.val = newValue;
- money.afterChange (newValue, oldValue); (Verrà ignorato se il suo valore non viene modificato)
- money.afterSet (newValue, oldValue);
Ora definiamo afterChange
listener che verrà attivato solo dopo che money.val
è stato modificato (mentre afterSet
verrà attivato anche se il nuovo valore è uguale a quello precedente):
money.afterChange = (newValue, oldValue) => {
console.log(`Money has been changed from ${oldValue} to ${newValue}`);
};
Ora imposta un nuovo valore 3
e guarda cosa succede:
money.val = 3;
Vedrai quanto segue nella console:
Money has been changed from 2 to 3
Per il codice completo, consultare https://gist.github.com/yusanshi/65745acd23c8587236c50e54f25731ab .