defineProperty
语法:
defineProperty(obj,key,{
})
---参数
obj:要代理的对象
key:要监听的属性
{}:分发get、set函数的对象
---返回值
监听过后的原对象
该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性并返回这个对象
将某个对象的所有属性进行监听代理
优点:兼容性好,支持 IE9,而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平
缺点:
1.不能监听数组的变化
2.必须遍历对象的每个属性
3.必须深层遍历嵌套的对象
proxy
语法:
new proxy(target,{
get(target,key){}
set(target,key,newValue){}
})
实例一个Proxy对象对某个对象进行代理
返回一个新对象
---参数
target:代理的目标对象
{}:执行操作时触发代理行为的函数
---返回值
代理过后的新对象
优点:
1.Proxy可以直接监听整个对象而非属性。
2.Proxy可以直接监听数组的变化。
3.Proxy有13中拦截方法,如ownKeys、deleteProperty、has 等是 Object.defineProperty 不具备的。
4.Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改;
5.Proxy做为新标准将受到浏览器产商重点持续的性能优化,也就是传说中的新标准的性能红利。
6.对于深层嵌套可以在get返回时将Proxy实例返回
省去了defineProperty需要递归遍历的麻烦