news 2026/6/15 13:41:03

Object.defineProperty和Proxy实现拦截的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Object.defineProperty和Proxy实现拦截的区别

1.Object.definedProperty的实现拦截必须得声明一个额外的变量,例如下面这样

constobj={};let_data="这是一些数据";Object.defineProperty(obj,"data",{get(){console.log("读取data的操作被拦截了");return_data;},});console.log(obj.data);

但是如果你这么写,就会报错,栈溢出,因为递归调用了

2.使用proxy,可以定义空对象,里面不写属性值,他不会报栈溢出的原因也是因为没有递归调用,根本原因是因为拦截器返回的不是它本身,而是obj的属性值

constobj={};constp=newProxy(obj,{get(obj,prop){console.log(`${prop}的读取操作被拦截了`);returnobj[prop];},});console.log(p.data);console.log(p.name);


3.如果你这么写,同样会报栈溢出

5.如果想要实现和proxy类似功能,可以这样写

constobj={name:'syt',age:4};consthandler={get(target,prop){console.log(`${prop}的读取操作被拦截了`);returntarget[prop];// target是另一个对象},set(target,prop,value){console.log(`${prop}的设置操作被拦截了`);target[prop]=value;// target是另一个对象returntrue;}};// 手动实现类似Proxy的功能functioncreateProxy(target,handler){constproxy={};Object.keys(target).forEach(key=>{Object.defineProperty(proxy,key,{get(){returnhandler.get(target,key);// 这里不会递归},set(value){handler.set(target,key,value);}});});returnproxy;}constp=createProxy(obj,handler);console.log(p.name)p.age=18


6.但是,这种写法,也是必须的在obj中写上所有的key,才可以拦截到,如果你不写的话就拦截不到

7.如果使用proxy的话,就可以不用定义key,写一个空的对象就可以


当然这两个只是拿get和set来做对比,简单记录下

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:35:24

基于STM32的点滴输液报警器(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4352309M设计简介:本设计是基于STM32的点滴输液报警器设计,主要实现以下功能:1、液晶屏实时显示设置滴速、当前滴速、剩…

作者头像 李华
网站建设 2026/6/15 13:31:12

基于单片机的智能语音点名系统(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4392310M设计简介:本设计是基于单片机的智能语音点名系统,主要实现以下功能:通过语音模块实现上电语音播报欢迎使用点名…

作者头像 李华
网站建设 2026/6/15 12:28:22

【沈阳航空航天大学】C++Qt小型宿舍管理软件[2025-12-15]

【沈阳航空航天大学】CQt小型宿舍管理软件[2025-12-15] 课程设计任务书 课程设计名称程序设计综合实践专业软件工程学生姓名班级软件2401题目名称宿舍管理软件起止日期2025 年 12 月 15 日起至 2025 年 12 月 26 日止 课设内容和要求: 学校宿舍中的学生经常会有变…

作者头像 李华
网站建设 2026/6/15 10:31:20

14、Mercurial与Buildbot:代码管理与持续集成实战指南

Mercurial与Buildbot:代码管理与持续集成实战指南 1. Mercurial基础操作 Mercurial是一款强大的分布式版本控制系统,其 clone 命令可用于复制仓库,方便用户开始对其进行操作。而 hg serve 可用于临时共享仓库供他人拉取代码,但它不允许用户推送更改,因为推送更改需要…

作者头像 李华
网站建设 2026/6/14 12:44:08

ruoyi-vue2前端集成DMN规则引擎

环境说明 基于RuoYi-Vue2q前端如何集成DMN组件 版本号:3.9.0 更多关于ruoyi集成工作流,请访问若依工作流 集成步骤 安装依赖 npm install dmn-js dmn-js-properties-panel --save npm install --save dmn-moddlevue.config.js增加dmn.js配置, 在transpileDepend…

作者头像 李华