Avec l'aide de getter et setter , vous pouvez définir une classe JavaScript qui fait une telle chose.
Tout d'abord, nous définissons notre classe appelée 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;
}
}
Supposons que nous voulons écouter les money
changements, créons une instance de MonitoredVariable
avec de l'argent initial 0
:
const money = new MonitoredVariable(0);
Ensuite, nous pourrions obtenir ou définir sa valeur en utilisant money.val
:
console.log(money.val); // Get its value
money.val = 2; // Set its value
Puisque nous n'avons défini aucun écouteur pour cela, rien de spécial ne se produit après money.val
modifications apportées à 2.
Définissons maintenant certains écouteurs. Nous avons quatre auditeurs disponibles: beforeSet
, beforeChange
, afterChange
, afterSet
. Les événements suivants se produisent séquentiellement lorsque vous utilisez money.val = newValue
pour modifier la valeur de la variable:
- money.beforeSet (newValue, oldValue);
- money.beforeChange (newValue, oldValue); (Sera ignoré si sa valeur n'est pas modifiée)
- money.val = newValue;
- money.afterChange (newValue, oldValue); (Sera ignoré si sa valeur n'est pas modifiée)
- money.afterSet (newValue, oldValue);
Maintenant, nous définissons l' afterChange
écouteur qui ne sera déclenché qu'après avoir money.val
changé (alors que afterSet
sera déclenché même si la nouvelle valeur est la même que l'ancienne):
money.afterChange = (newValue, oldValue) => {
console.log(`Money has been changed from ${oldValue} to ${newValue}`);
};
Maintenant, définissez une nouvelle valeur 3
et voyez ce qui se passe:
money.val = 3;
Vous verrez ce qui suit dans la console:
Money has been changed from 2 to 3
Pour le code complet, voir https://gist.github.com/yusanshi/65745acd23c8587236c50e54f25731ab .