当前位置:网站首页>defineProperty和proxy区别
defineProperty和proxy区别
2022-08-11 11:51:00 【-加油】
监听对象
1、defineProperty
只能劫持对象的某一个属性,不能对整个对象进行劫持,如果需要监听某一个对象的所有属性,需要遍历对象的所有属性并对其进行劫持来进行监听。
无法监听对象新增属性,
// 原始对象
const data = {
name: 'Jane',
age: 21,
hhh:{
xxx:'hxhx'
}
}
Object.keys(data).forEach(key => {
let oldValue = data[key];
Object.defineProperty(data, key, {
get() {
console.log('%c 调用get', 'color: red') // 这里为了控制台更明显看出调用,使用了不同颜色进行区分
return oldValue
},
set(value) {
console.log('%c 调用set', 'color: blue')
oldValue = value
}
})
})
console.log(data.name) // Jane get
console.log(data.age) // 21 get
console.log(data.hhh.xxx);//hxhx get
data.name = 'Jian' // set 修改
console.log(data.name) // Jian get
data.like = 'apple' // 不会set 新增
console.log(data.like);//apple 不会get
2、proxy
获取原始对象的属性不会触发 getter ,只有访问代理对象的属性才能触发 getter。
proxy 可以监听对象新增属性。
有专门针对属性删除的方法 deleteProperty,可以在对象属性被删除时触发
// 原始对象
const data = {
name: 'Jane',
age: 21,
hhh:{
xxx:'hxhx'
}
}
const proxyData = new Proxy(data, {
get(target, prop) {
console.log('%c 调用get', 'color: red')
return Reflect.get(target, prop)
},
set(target, prop, value) {
console.log('%c 调用set', 'color: blue')
return Reflect.set(target, prop, value)
},
deleteProperty(target, prop) {
console.log('%c 调用delete', 'color: orange')
Reflect.deleteProperty(target, prop)
return true
}
})
console.log(proxyData.name) // Jane
console.log( data.name) // Jane 不会触发get
console.log(proxyData.hhh.xxx); //hxhx get
console.log(data.hhh.xxx); //hxhx 不会触发get
proxyData.name = 'Jian' // set 修改
console.log(proxyData.name) // Jian get
console.log( data.name) // Jian 不会get
data.age = '18' // 不会set 修改
console.log(data.age); //18 不会get
console.log(proxyData.age);//18 get
data.like = 'apple' // 不会set 新增
console.log(data.like); // apple 不会get
console.log(proxyData.like);//app get
proxyData.dream = 'sleep' // set 新增
console.log(data.dream); //sleep 不会get
console.log(proxyData.dream);//sleep get
delete proxyData.age // 调用delete
参考链接
边栏推荐
猜你喜欢
vending machine
开源H.264 Video Encoder IP Core V2.0 介绍
The old saying: The interview must ask "Three handshakes, four waves", so you can't forget it
资本市场做好为工业互联网“买单”的准备了吗?
Ince-Gaussian mode
[10 o'clock open class]: Optimization of AV1 encoder and its application in streaming media and real-time communication
初始化块(父类优先于子类)
【五一特刊】FPGA零基础学习:VGA协议驱动设计
Go编译原理系列10(逃逸分析)
Jmeter性能测试
随机推荐
资本市场做好为工业互联网“买单”的准备了吗?
微服务分布式构架开发实战PDF,阿里架构师推荐,快快收藏吧
同城是美团电商的解法吗?
【黑马早报】抖音否认与头部主播签对赌协议;阿迪达斯CEO承认在中国犯了错;网易云社交App心遇被指涉黄;联通董事长称5G资费比点外卖还便宜
B端产品需求分析与优先级判断
公共经济学(开卷)期末复习题
关于b/s技术的一些思考--模板技术
面试官:Redis Zset的实现为什么用跳表,而不用平衡树?
Flutter 教程之 在 Flutter 中生成 JSON 模型,在 Flutter GetX 中过滤列表和延迟搜索
老生常谈:面试必问“三次握手,四次挥手”这么讲,保证你忘不了
flutter面试题收集
SH7001单电池恒压线性充电IC
Through the thermal lens focus on different types of gaussian model
elemntUI限制时间选择器不能跨月并且不大于未来时间
The old saying: The interview must ask "Three handshakes, four waves", so you can't forget it
Flutter经验整理
请求转发与重定向
谷歌搜索,全球宕机??
img图片加载错误时显示默认图片
39页智慧粮库解决方案