-
Notifications
You must be signed in to change notification settings - Fork 64
Expand file tree
/
Copy path1.js
More file actions
77 lines (76 loc) · 1.88 KB
/
1.js
File metadata and controls
77 lines (76 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class Dep {
constructor() {
this.subs = new Map();
}
addSub(key, sub) {
const hasSub = this.subs.get(key);
if (hasSub) {
hasSub.add(sub);
} else {
this.subs.set(key, new Set([sub]));
}
}
notify(key) {
if (this.subs.get(key)) {
this.subs.get(key).forEach(sub => {
sub.update();
});
}
}
}
class Watcher {
constructor(obj, key, cb) {
this.obj = obj;
this.key = key;
this.cb = cb; // 回调
this.value = this.get(); // 获取老数据
}
get() {
Dep.target = this;
let value = this.obj[this.key];
Dep.target = null;
return value;
}
// 将订阅者放入待更新队列等待批量更新
update() {
let newVal = this.obj[this.key];
if (this.value !== newVal) {
this.cb(newVal);
}
}
}
function Observer(obj) {
Object.keys(obj).forEach(key => { // 做深度监听
if (typeof obj[key] === 'object') {
obj[key] = Observer(obj[key]);
}
});
let dep = new Dep();
let handler = {
get: function (target, key, receiver) {
Dep.target && dep.addSub(key, Dep.target);
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
let result = Reflect.set(target, key, value, receiver);
dep.notify(key);
return result;
}
};
return new Proxy(obj, handler)
}
let data = {
name: '渣渣辉'
};
function print1(data) {
console.log('我系', data);
}
function print2(data) {
console.log('我今年', data);
}
data = Observer(data);
new Watcher(data, 'name', print1);
data.name = '杨过'; // 我系 杨过
new Watcher(data, 'age', print2);
data.age = '24'; // 我今年 24
console.log(data);