Observable
СÑвоÑÑÑÑ ÑÑнкÑÑÑ makeObservable(target), Ñка âÑобиÑÑ Ð¾Ð±âÑÐºÑ Ð´Ð¾ÑÑÑпним Ð´Ð»Ñ ÑпоÑÑеÑеженнÑâ, повеÑÑаÑÑи пÑокÑÑ.
ÐÑÑ Ñк Ñе Ð¼Ð°Ñ Ð¿ÑаÑÑваÑи:
function makeObservable(target) {
/* Ð²Ð°Ñ ÐºÐ¾Ð´ */
}
let user = {};
user = makeObservable(user);
user.observe((key, value) => {
alert(`SET ${key}=${value}`);
});
user.name = "Ðван"; // ÑповÑÑаÑ: SET name=Ðван
ÐнÑими Ñловами, обâÑкÑ, повеÑнÑÑий makeObservable, Ñакий же, Ñк оÑигÑналÑний, але Ñакож Ð¼Ð°Ñ Ð¼ÐµÑод observe(handler), Ñкий вÑÑановлÑÑ ÑÑнкÑÑÑ handler Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¿Ñи бÑдÑ-ÑкÑй змÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ.
ЩоÑазÑ, коли влаÑÑивÑÑÑÑ Ð·Ð¼ÑнÑÑÑÑÑÑ, викликаÑÑÑÑÑ handler(key, value) з Ð½Ð°Ð·Ð²Ð¾Ñ Ñа знаÑеннÑм влаÑÑивоÑÑÑ.
P.S. У ÑÑÐ¾Ð¼Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ð±Ð°Ð¹Ñе лиÑе пÑо Ð·Ð°Ð¿Ð¸Ñ Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ. ÐодÑбним Ñином можна ÑеалÑзÑваÑи й ÑнÑÑ Ð¾Ð¿ÐµÑаÑÑÑ.
Ð ÑÑÐµÐ½Ð½Ñ ÑкладаÑÑÑÑÑ Ð· Ð´Ð²Ð¾Ñ ÑаÑÑин:
- ЩоÑазÑ, коли викликаÑÑÑÑÑ
.observe(handler), нам поÑÑÑбно деÑÑ Ð·Ð°Ð¿Ð°Ð¼âÑÑаÑи обÑобник, Ñоб маÑи можливÑÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñи його пÑзнÑÑе. Ðи можемо збеÑÑгаÑи обÑобники пÑÑмо в обâÑкÑÑ, викоÑиÑÑовÑÑÑи Ð½Ð°Ñ Ñимвол Ñк клÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ. - Ðам поÑÑÑбен пÑокÑÑ Ð· паÑÑкоÑ
setÐ´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¾Ð±ÑобникÑв Ñ ÑÐ°Ð·Ñ Ð±ÑдÑ-ÑÐºÐ¸Ñ Ð·Ð¼Ñн.
let handlers = Symbol('handlers');
function makeObservable(target) {
// 1. ÐнÑÑÑалÑзÑÑмо ÑÑ
овиÑе обÑобникÑв
target[handlers] = [];
// ÐбеÑежемо ÑÑнкÑÑÑ-обÑобник в маÑÐ¸Ð²Ñ Ð´Ð»Ñ Ð¼Ð°Ð¹Ð±ÑÑнÑÑ
викликÑв
target.observe = function(handler) {
this[handlers].push(handler);
};
// 2. СÑвоÑимо пÑокÑÑ Ð´Ð»Ñ Ð¾Ð±Ñобки змÑн
return new Proxy(target, {
set(target, property, value, receiver) {
let success = Reflect.set(...arguments); // пеÑенапÑавимо опеÑаÑÑÑ Ð½Ð° обâÑкÑ
if (success) { // ÑкÑо пÑд ÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ðµ бÑло помилок
// виклиÑемо вÑÑ Ð¾Ð±Ñобники
target[handlers].forEach(handler => handler(property, value));
}
return success;
}
});
}
let user = {};
user = makeObservable(user);
user.observe((key, value) => {
alert(`SET ${key}=${value}`);
});
user.name = "Ðван";