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 money
thay đổi, hãy tạo một ví dụ MonitoredVariable
vớ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.val
thay đổ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 afterChange
nghe chỉ được kích hoạt sau khi money.val
đã thay đổi (trong khi afterSet
sẽ đượ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 3
và 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 .