getter setter
1 | let obj = { |
1 | let obj = { |
示例
vue中的数据劫持
给每个对象都添加一个getter setter 当值变化可以实现更新视图的功能
1 | let obj = { |
Object.defineProperty
1 | let obj = {}; |
1 | let obj = {}; |
1 | let obj = {}; |
现在加入get set
1 | let obj = {}; |
现在我希望把obj上的ab循环 将他们的定义方式和上面一样 如下:
1 | let obj = { |
缺陷:现在我已近给a、b设置get、set了,但是如果我新加一个c,它是没有get、set的
1
2obj.c = 200;
console.log(obj); // { a: [Getter/Setter], b: [Getter/Setter], c: 200 }
下面用proxy来实现:
Proxy
特点 兼容性差
代理 可以创造一个代理 帮我们干某些事
对象代理
1 | let obj = { |
现在给obj赋值
1 | let obj = { |
可以用Reflect 反射属性
1 | let obj = { |
数组代理
1 | let obj = [1,2,3]; |
这里把修改length长度也打印出来了,做如下优化:
1 | let obj = [1,2,3]; |
优点: 支持数组,可直接更改数组 达到拦截的目的
当obj中有多层对象时,如下:
1 | let obj = { |
所以要递归代理 这里要给 {b:{c:{d: 1}}} 这个对象加上代理,然后要把这个代理赋给a,这样就会触发obj的set ,同样 {c:{d: 1}}要给这个对象加上代理,就会触发{b:{c:{d: 1}}}这个对象的set
1 | let obj = { |
将递归代理的这个过程抽离出来
1 | let obj = { |