ES6: Proxy概念及用法

news/2025/2/22 15:46:46/

Proxy如其名, 它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器”

引入问题:

//问题: 能够在obj.data修改成222之前拦截到这个操作
/*本质上, 我们想要在修改属性值的同时, 去修改DOM值, 即做到同步更新页面
*/
let obj = {data: "111"
}
obj.data = "222"

如果我们采用ES6之前的方式解决, 采用Object.defineProperty(对象, 属性, {})

let obj = {}
Object.defineProperty(obj, "data", {get() {console.log("get"); // 属性被访问时调用},set() {console.log("set"); // 属性被修改时调用}
})
console.log(obj.data); // get undefined <-此时调用get
obj.data = "test" // set <-此时调用set

实际应用: 更新对象属性, 同时更新页面

let obj = {}
Object.defineProperty(obj, "data", {get() {console.log("get");return box.innerHTML},set(value) {console.log("set");box.innerHTML = value}
})
console.log(obj.data); 
obj.data = "test"

注意: vue3之后把Object.defineProperty替换成了Proxy

总结一下 Object.defineProperty 的缺点:

1-每次只能拦截一个属性

2-它只能拦截对象


以下是Proxy中的方法:

get方法: 访问属性时触发

let target = {}
let proxy = new Proxy(target,{get(target,prop){return target[prop]}
})

set方法: 修改属性时触发

let target = {}
let proxy = new Proxy(target,{get(target,prop){return target[prop]},set(target,prop,value){if(prop==="data"){box.innerHTML = value}target[prop] = value;}
})

has方法: 判断有没有某个属性(需要在proxy下使用, 并通过”属性” in proxy来判断**)**

let target = {_prop: "内部数据"
}
let proxy = new Proxy(target, {get(target, prop) {return target[prop]},set(target, prop, value) {if (prop === "data") {box.innerHTML = value}target[prop] = value;},has(target, key) {if (key[0] === '_') {return false;}return key in target;}
})

注意: 我们可以通过 ”属性” in proxy 的方式来判断对象是否有属性

 

this问题

在proxy中的get与set的this指向的就是proxy. 因此, 如果是对象的方法, 我们需要对它的this进行修正

let s = new Set()let proxy = new Proxy(s, {get(target, key) {// 如果是方法, 需要修正this指向let value = target[key]if(value instanceof Function) {return value.bind(target)}return value},set() {console.log("set");}
})
//proxy.add(1) // Uncaught TypeError: Method Set.prototype.add called on incompatible receiver #<Set>
//修改后:
console.log(proxy.add(1)); // Set(1) {1}

Proxy本质上属于元编程非破坏性数据劫持,在原对象的基础上进行了功能的衍生而又不影响原对象,符合松耦合高内聚的设计理念。

参考: 015-ES6-Proxy_哔哩哔哩_bilibili 


http://www.ppmy.cn/news/877397.html

相关文章

【转】nbsp;多姿多彩的宜兴话

http://hi.baidu.com/&#xfffd;lounge/blog/item/e64710cd66da6394c91768e1.html 【转】 多姿多彩的宜兴话 源于生活&#xff0c;传承古音&#xff0c;吸收外来语&#xff0c;合音&#xff0c;多音&#xff0c;文白两读&#xff0c;方言岛&#xff0c;构成了一个多姿多彩的…

服装店起名的知识

服装店起名第一要考虑服装本身用户群体的定位&#xff0c;如女装男装童装&#xff0c;不同用户定位肯定名字不一定&#xff0c;其次服装店起名要考虑名字好记&#xff0c;好读&#xff0c;有利于店铺品牌的传播和推广&#xff0c;如何服装店取名怎么样&#xff0c;有什么名字来…

免费药店简介api 获取药店详情

药店大全可查询药店联系电话,药店邮箱,药房网址、药房地址等相关药店简介信息。 !!注意:这里logo是医院的LOGO,由于有些医院暂且还没有LOGO,网站返回的默认 logo=img/drugstore/default.jpg ;这里开发者可以自由的修改默认返回的LOGO。 对于一些不存在的的参数值这里返…

中国地理

中国地理常识大全 1、中国位于亚洲东部、太平洋西岸&#xff0c;它的版图被形象地比作一只头朝东尾朝西的金鸡&#xff0c;地势西高东低。 2、中国陆地面积约960万平方公里&#xff0c;在世界各国中&#xff0c;仅次于俄罗斯、加拿大&#xff0c;居第三位&#xff0c;差不多同整…

亲民地理第39期-佛山(2)南风古灶

广东南风古灶文化创意园位于广东省佛山市著名的南国陶都石湾&#xff0c;以五千年的制陶历史而闻名世界。它拥有国家重点保护文物单位——南风古灶及高灶&#xff0c;古寮场&#xff0c;明清古建筑群。南风古灶景区内有全国重点保护文物、被称为陶瓷活化石的南风古灶和高灶&…

亲民地理-第39期-佛山(2)南风古灶_我是亲民_新浪博客

广东南风古灶文化创意园位于广东省佛山市著名的南国陶都石湾&#xff0c;以五千年的制陶历史而闻名世界。它拥有国家重点保护文物单位——南风古灶及高灶&#xff0c;古寮场&#xff0c;明清古建筑群。南风古灶景区内有全国重点保护文物、被称为陶瓷活化石的南风古灶和高灶&…

宜兴电信成功跨界合作开拓农村物联网市场

“陶都”江苏宜兴眼下正演绎物联网应用的“连台好戏”。5月9日&#xff0c;中国电信江苏宜兴分公司聚合物联网技术和全光网建设的优势&#xff0c;在农村通过跨界合作的方式&#xff0c;实现了今年头4个月的物联网业务爆发式增长&#xff0c;走出了“政府支持、电信引领、农村搭…

MySql 函数

自定义函数 create function <name>&#xff08;&#xff09; returns [varchar(20)] begin ....   end; CREATE FUNCTION getGrade (mark INT) RETURNS VARCHAR (20) BEGINRETURN (CASE floor(mark / 10)WHEN 5 THEN不及格WHEN 6 THEN需要努力WHEN 8 THEN成绩优秀ELSE…