首页 > web前端 > js教程 > 正文

什么是javascript代理_Proxy对象能拦截哪些操作

夢幻星辰
发布: 2025-12-21 11:10:02
原创
926人浏览过
Proxy是JavaScript用于拦截并自定义对象基本操作的代理构造函数,通过handler提供get、set、has、deleteProperty等trap拦截读写、枚举、构造等行为,支持校验、日志、响应式等场景。

什么是javascript代理_proxy对象能拦截哪些操作

JavaScript 的 Proxy 对象是一个用于创建代理(proxy)以拦截并自定义对目标对象基本操作的内置构造函数。 它不是用来替代对象的,而是“包一层”,让开发者能在读取、赋值、删除、遍历等关键行为发生时插入自己的逻辑——比如校验、日志、响应式更新、权限控制等。

Proxy 能拦截哪些操作?

Proxy 通过 handler(处理器)对象 提供一系列可选的捕获器(traps),每个 trap 对应一种底层操作。常用且高频的包括:

  • get(target, prop, receiver):拦截读取属性(obj.xobj['x'])、访问原型链上的属性,也用于 in 操作符和 for...in 遍历的属性存在性检查。
  • set(target, prop, value, receiver):拦截设置属性(obj.x = 1obj['x'] = 1),可阻止赋值、转换类型、触发通知等。
  • has(target, prop):拦截 prop in obj 操作,控制属性“是否存在”的语义。
  • deleteProperty(target, prop):拦截 delete obj.x,可禁止删除或做清理工作。
  • ownKeys(target):拦截 Object.getOwnPropertyNames()Object.keys()for...in 等枚举操作,能隐藏或动态添加键名。
  • defineProperty(target, prop, descriptor):拦截 Object.defineProperty() 调用,控制属性描述符是否生效。
  • getOwnPropertyDescriptor(target, prop):拦截 Object.getOwnPropertyDescriptor(),可伪造或过滤属性描述信息。
  • construct(target, args, newTarget):仅对函数/类代理有效,拦截 new ProxyFn(...) 调用,可返回自定义实例。
  • apply(target, thisArg, args):仅对函数代理有效,拦截函数调用(proxyFn(...)),可用于装饰、节流、参数预处理等。

一个简单但典型的例子

比如用 Proxy 实现一个带数据校验的“安全对象”:

爱改写
爱改写

AI写作和改写润色工具

爱改写 87
查看详情 爱改写
const validator = {
  set(obj, prop, value) {
    if (prop === 'age' && typeof value !== 'number') {
      throw new Error('age 必须是数字');
    }
    obj[prop] = value;
    return true; // 必须返回 true 表示设置成功
  }
};

const person = new Proxy({}, validator);
person.name = '张三'; // ✅ 正常
person.age = 25;     // ✅ 正常
person.age = '25';   // ❌ 抛出错误
登录后复制

注意几个关键细节

  • Proxy 只代理**直接操作**,不递归代理嵌套对象;若需深度代理,得在 get 中对返回的 object 再套一层 Proxy。
  • 某些操作(如 Object.isExtensible())有对应的 trap(isExtensible),但默认行为由目标对象决定;若 handler 没定义该 trap,就透传给目标对象。
  • Proxy 无法拦截所有操作:例如 obj.toString() 不走 get(除非显式重写 toString 属性),而 obj + '' 会触发 toPrimitive(需配合 Symbol.toPrimitive)。
  • 被代理的对象(target)与 Proxy 实例是分离的;修改 target 本身不会触发 handler,只有通过 Proxy 实例的操作才会被拦截。

它不是语法糖,而是 JavaScript 提供的一套底层元编程能力,Vue 3 的响应式系统、各类 mock 工具、API 封装层都重度依赖 Proxy。

立即学习Java免费学习笔记(深入)”;

以上就是什么是javascript代理_Proxy对象能拦截哪些操作的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号