Observable ë§ë¤ê¸°
íë½ì를 ë°íí´ âê°ì²´ë¥¼ observable íê² ë§ë¤ì´ì£¼ëâ í¨ì makeObservable(target)를 ë§ë¤ì´ë³´ì¸ì.
ìµì¢ ê²°ê³¼ë ìë ì¡°ê±´ì ë§ì¡±í´ì¼ í©ëë¤.
function makeObservable(target) {
/* ì¬ê¸°ì ì½ë를 ìì±íì¸ì. */
}
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)ê° í¸ì¶ëì´ì¼ íì£ .
ì°¸ê³ : ì´ ë¬¸ì ìì íë¡í¼í°ì ê°ì ì°ë ¤ë ê²½ì°ë§ ê³ ë ¤í´ì ëµì ìì±í´ë³´ì¸ì. ì½ê¸° ë±ì ëìì ì ì¬í ë°©ë²ì ì¬ì©í´ 구íí ì ììµëë¤.
í´ëµì í¬ê² ë ë¶ë¶ì¼ë¡ 구ì±ë©ëë¤.
.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 = "John";
