-
Notifications
You must be signed in to change notification settings - Fork 0
/
my_poxy.js
96 lines (92 loc) · 2.86 KB
/
my_poxy.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// // 构建一个新的对象类型Object的构造器,以达到proxy的效果,无需递归拦截
class MyProxy {
constructor(obj) {
let map = new Map();
this._map = map;
this.init(obj, map);
// let proxy = this.createProxy(map, obj);
// return proxy;
}
init(obj, map) {
for (let prop in obj) {
// console.log(prop)
this.def(obj,'_obj_',this);
// if (typeof obj[prop] === 'object') {
// map.set(prop, Object.assign({}, obj[prop]));
// this.init(obj[prop], map);
// } else {
// map.set(prop, obj[prop]);
// }
}
}
def(obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
createProxy(map, obj) {
for (let prop in obj) {
// if (typeof obj[prop] === 'object') {
// obj[prop] = this.createProxy(map,obj[prop]);
// // console.log(map.get(prop));
// }
Object.defineProperty(obj, prop, {
get() {
console.log(`obj${obj.toString()}/prop:${prop} => ${map.get(prop)}`)
return map.get(prop);
}
});
}
return obj;
}
}
let temp = new MyProxy({
a: {
b: {
c: 1
}
}
});
// let obj = {
// 'a': {
// 'b': {
// 'c' : 1
// }
// }
// };
// function observe(obj) {
// if (obj !== null && typeof obj === 'object') {
// Object.keys(obj).forEach(key => {
// let internalValue = obj[key];
// observe(internalValue); // 递归调用observe,处理内部对象
// Object.defineProperty(obj, key, {
// get() {
// console.log(`Getting property: ${key}`);
// return internalValue;
// },
// set(newValue) {
// console.log(`Setting property: ${key} with value: ${newValue}`);
// internalValue = newValue;
// }
// });
// });
// }
// return obj;
// }
// obj = observe(obj);
// // console.log(obj.a.b); // 输出: Getting property: a, Getting property: b,然后输出: 1
// // obj.a.b = 2; // 输出: Setting property: b with value: 2
// console.log(obj.a.b.c); // 输出: Getting property: a, Getting property: b,然后输出: 2
// function def(obj, key, val, enumerable) {
// Object.defineProperty(obj, key, {
// value: val,
// enumerable: !!enumerable,
// writable: true,
// configurable: true
// });
// }
// def(obj,'_obj_',"a");
// console.log(obj)