å¯è§å¯çï¼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 è¿åç对象就ååå§å¯¹è±¡ä¸æ ·ï¼ä½æ¯å
·æ observe(handler) æ¹æ³ï¼è¯¥æ¹æ³å¯ä»¥å° handler 彿°è®¾ç½®ä¸ºå¨ä»»ä½å±æ§è¢«æ´æ¹æ¶ï¼é½ä¼è¢«è°ç¨ç彿°ã
æ¯å½æå±æ§è¢«æ´æ¹æ¶ï¼é½ä¼ä½¿ç¨å±æ§çåç§°å屿§å¼è°ç¨ handler(key, value) 彿°ã
P.S. 卿¬ä»»å¡ä¸ï¼ä½ å¯ä»¥åªå ³æ³¨å±æ§åå ¥ãå ¶ä»çæä½å¯ä»¥éè¿ç±»ä¼¼çæ¹å¼å®ç°ã
è¯¥è§£å³æ¹æ¡å æ¬ä¸¤é¨åï¼
- æ 论
.observe(handler)使¶è¢«è°ç¨ï¼æä»¬é½éè¦å¨æä¸ªå°æ¹è®°ä½ handlerï¼ä»¥ä¾¿ä»¥åå¯ä»¥è°ç¨å®ãæä»¬å¯ä»¥ä½¿ç¨ Symbol ä½ä¸ºå±æ§é®ï¼å° handler ç´æ¥åå¨å¨å¯¹è±¡ä¸ã - æä»¬éè¦ä¸ä¸ªå¸¦æ
seté·é±ç proxy æ¥å¨åç任使´æ¹æ¶è°ç¨ handlerã
let handlers = Symbol('handlers');
function makeObservable(target) {
// 1. åå§å handler åå¨
target[handlers] = [];
// å° handler 彿°åå¨å°æ°ç»ä¸ï¼ä»¥ä¾¿äºä¹åè°ç¨
target.observe = function(handler) {
this[handlers].push(handler);
};
// 2. å建ä¸ä¸ª proxy 以å¤çæ´æ¹
return new Proxy(target, {
set(target, property, value, receiver) {
let success = Reflect.set(...arguments); // å°æä½è½¬åç»å¯¹è±¡
if (success) { // 妿å¨è®¾ç½®å±æ§æ¶æ²¡æåºç° error
// è°ç¨ææ handler
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";