ES6 的 Proxy功能强大,它允许你拦截并自定义对象的基本操作。下面这个表格汇总了 Proxy可以拦截的主要操作(也称为陷阱,traps)及其触发时机。
| 操作类别 | 拦截器方法 (Trap) | 触发时机/拦截的操作 |
|---|---|---|
| 属性访问 | get(target, prop, receiver) | 读取属性,如 obj.name |
set(target, prop, value, receiver) | 设置属性值,如 obj.name = 'value' | |
has(target, prop) | 执行 in操作符,如 'name' in obj | |
deleteProperty(target, prop) | 执行 delete操作符,如 delete obj.name | |
| 属性描述 | defineProperty(target, prop, descriptor) | 调用 Object.defineProperty() |
getOwnPropertyDescriptor(target, prop) | 调用 Object.getOwnPropertyDescriptor() | |
| 原型与扩展 | getPrototypeOf(target) | 调用 Object.getPrototypeOf() |
setPrototypeOf(target, prototype) | 调用 Object.setPrototypeOf() | |
isExtensible(target) | 调用 Object.isExtensible() | |
preventExtensions(target) | 调用 Object.preventExtensions() | |
| 枚举与迭代 | ownKeys(target) | 调用 Object.keys(), Object.getOwnPropertyNames(), Object.getOwnPropertySymbols(), for...in |
| 函数调用 | apply(target, thisArg, argumentsList) | 代理目标为函数时的调用,如 proxy() |
construct(target, argumentsList, newTarget) | 使用 new操作符,如 new proxy() |