Với sự trợ giúp của getter và setter , bạn có thể định nghĩa một lớp JavaScript thực hiện điều đó.
Đầu tiên, chúng tôi định nghĩa lớp của chúng tôi được gọi là 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;
}
}
Giả sử rằng chúng tôi muốn lắng nghe các moneythay đổi, hãy tạo một ví dụ MonitoredVariablevới số tiền ban đầu 0:
const money = new MonitoredVariable(0);
Sau đó, chúng tôi có thể nhận hoặc đặt giá trị của nó bằng cách sử dụng money.val:
console.log(money.val); // Get its value
money.val = 2; // Set its value
Vì chúng tôi chưa định nghĩa bất kỳ người nghe nào cho nó, nên không có gì đặc biệt xảy ra sau khi money.valthay đổi thành 2.
Bây giờ hãy xác định một số người nghe. Chúng tôi có bốn người nghe sẵn: beforeSet, beforeChange, afterChange, afterSet. Điều sau đây sẽ xảy ra tuần tự khi bạn sử dụng money.val = newValueđể thay đổi giá trị của biến:
- tiền.b Beforeset (newValue, oldValue);
- tiền.b BeforeChange (newValue, oldValue); (Sẽ bị bỏ qua nếu giá trị của nó không thay đổi)
- tiền.val = newValue;
- tiền.afterChange (newValue, oldValue); (Sẽ bị bỏ qua nếu giá trị của nó không thay đổi)
- tiền.afterset (newValue, oldValue);
Bây giờ chúng tôi xác định trình afterChangenghe chỉ được kích hoạt sau khi money.valđã thay đổi (trong khi afterSetsẽ được kích hoạt ngay cả khi giá trị mới giống với giá trị cũ):
money.afterChange = (newValue, oldValue) => {
console.log(`Money has been changed from ${oldValue} to ${newValue}`);
};
Bây giờ hãy đặt một giá trị mới 3và xem điều gì sẽ xảy ra:
money.val = 3;
Bạn sẽ thấy như sau trong bảng điều khiển:
Money has been changed from 2 to 3
Để biết mã đầy đủ, hãy xem https://gist.github.com/yusanshi/65745acd23c8587236c50e54f25731ab .