1.proxy 的用法,defineProperty 的用法
const myProxy = new Proxy(target, handle)
Object.defineProperty(obj, prop, descriptor)
let obj = {
name: "小彭",
age: 22,
like:["basketball", "music"],
intro:{
lang: "js",
}
}
const myProxy = new Proxy(obj, {
get(target, key){
console.log("target", target)
console.log("key", key)
return target[key]
}
set(target, property, value) {
target[property] = value
return true
}
})
let myObj = Object.defineProperty(obj, 'sex', {} )
myObj.sex = "男"
console.log(obj.sex)
myProxy.intro.lang = "javascript"
console.log(obj.intro.lang)
obj.sex = "男"
console.log(myProxy.sex)
2.proxy 和 defineProperty 的区别
- definedProperty 是劫持对象的属性,不能监听属性的添加和删除,新增元素需要再次 definedProperty
- Proxy 劫持的是整个对象,不需要做特殊处理
- 使用 defineProperty 时,我们修改原来的 obj 对象就可以触发拦截,而使用 Proxy,就必须修改代理对象,即 Proxy 的实例才可以触发拦截
- 使用 defineProperty 需要遍历对象的每一个属性,对于性能会有一定的影响
- Proxy 可以对数组基于下标的修改的检测,长度修改的监测,而且对 Map、Set、WeakMap 和 WeakSet 的支持