Observable
ãããã·ãè¿ããã¨ã§ãâãªãã¸ã§ã¯ããç£è¦å¯è½ã«ããâ 颿° makeObservable(target) ã使ãã¦ãã ããã
ãã®ããã«åä½ãã¾ã:
function makeObservable(target) {
/* your code */
}
let user = {};
user = makeObservable(user);
user.observe((key, value) => {
alert(`SET ${key}=${value}`);
});
user.name = "John"; // alerts: SET name=John
ã¤ã¾ããmakeObservable ã«ããè¿å´ããããªãã¸ã§ã¯ãã¯å
ã®ãªãã¸ã§ã¯ãã®ããã«è¦ãã¾ãããä»»æã®ããããã£å¤æ´æã«å¼ã³åºããã handler 颿°ãã»ããããã¡ã½ãã observe(handler) ãæã¡ã¾ãã
ããããã£ã夿´ããã¨ãã¯ãã¤ã§ãããããã£ã®ååã¨å¤ã¨ä¸ç·ã« handler(key, value) ãå¼ã°ãã¾ãã
P.S. ãã®ã¿ã¹ã¯ã§ã¯ãããããã£ã®æ¸ãè¾¼ã¿ã«ã ãæ³¨ç®ãã¦ãã ãããä»ã®æä½ãåæ§ã®æ¹æ³ã§å®è£ ãããã¨ã¯ã§ãã¾ãã
解決çã¯2ã¤ã®ãã¼ãã§æ§æããã¾ã:
.observe(handler)ãå¼ã°ããã¨ãã¯ãå¾ã§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 = "John";