Proxy + Reflect 实现 响应的数据变化
Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)
let p = new Proxy(target, handler);
- get(target, propKey, receiver):拦截对象属性的读取,比如
proxy.foo
和proxy['foo']
。 - set(target, propKey, value, receiver):拦截对象属性的设置,比如
proxy.foo = v
或proxy['foo'] = v
,返回一个布尔值。
let handler = { get(target,key) { //如果得到的值是一个对象我们还得再调一次 if(typeof target[key]=='object') { return new Proxy(target[key],handler) } return Reflect.get(target,key); }, set(target,key,value) { if(key==='length') { return true; } update(); return Reflect.set(target,key,value); } }; let obj = { a:{a:1}, b:2, d:[1,2,3,4] }; function update() { console.log('更新视图') }; let p = new Proxy(obj,handler); obj.c=3; console.log(obj)
Reflect.get(target,key); 相当于 target{key]
Reflect.set(target,key,value); 相当于 target[key}= value;
输出:
{ a: { a: 1 }, b: 2, d: [ 1, 2, 3, 4 ], c: 3 }
越努力越幸运