-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvue2reactive.js
66 lines (60 loc) · 1.47 KB
/
vue2reactive.js
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
/*
* @Author: your name
* @Date: 2021-08-12 16:47:16
* @LastEditTime: 2022-01-05 10:21:31
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \vue3.0-cli-ts\study-every-day\vue2.js
*/
let arrProto = Object.create(Array.prototype);
['push', 'shift', 'pop', 'unshift', 'splice'].forEach((method) => {
arrProto[method] = function(...args) {
// 函数劫持,新函数内部继续调用老函数
Array.prototype[method].call(this, ...args);
updateView();
};
});
// 收集data返回的对象1
function observer(targetObj) {
if (Object.prototype.toString.call(targetObj).slice(8, -1) !== 'Object') {
return;
}
if (targetObj instanceof Array) {
Object.setPrototypeOf(targetObj, arrProto);
// targetObj.__proto__ = arrProto;
}
// 遍历对象
for (let key in targetObj) {
defineReactive(targetObj, key, Reflect.get(targetObj, key));
}
}
// 通过Object.defineProperty getter/setter设置获取
function defineReactive(targetObj, key, value) {
observer(value);
Object.defineProperty(targetObj, key, {
get() {
console.log(777);
return value;
},
set(newValue) {
if (newValue !== value) {
observer(newValue);
updateView();
value = newValue;
}
},
});
}
function updateView() {
console.log('更新视图');
}
let data = {
name: 'llq',
id: 15,
desc: '甩哥',
age: 20,
arr: [1, 2, 3],
};
observer(data);
data.age = 18;
// data.arr.push(4);