推荐答案
Proxy 对象可以拦截以下这些操作:
get(target, prop, receiver)
: 拦截读取属性的操作。set(target, prop, value, receiver)
: 拦截设置属性的操作。has(target, prop)
: 拦截prop in target
的操作。deleteProperty(target, prop)
: 拦截delete target[prop]
的操作。ownKeys(target)
: 拦截Object.getOwnPropertyNames(target)
、Object.getOwnPropertySymbols(target)
、Object.keys(target)
等操作。getOwnPropertyDescriptor(target, prop)
: 拦截Object.getOwnPropertyDescriptor(target, prop)
的操作。defineProperty(target, prop, descriptor)
: 拦截Object.defineProperty(target, prop, descriptor)
的操作。preventExtensions(target)
: 拦截Object.preventExtensions(target)
的操作。getPrototypeOf(target)
: 拦截Object.getPrototypeOf(target)
的操作。setPrototypeOf(target, prototype)
: 拦截Object.setPrototypeOf(target, prototype)
的操作。isExtensible(target)
: 拦截Object.isExtensible(target)
的操作。apply(target, thisArg, argumentsList)
: 拦截函数调用target(...argumentsList)
的操作,仅当target
为函数时生效。construct(target, argumentsList, newTarget)
: 拦截new target(...argumentsList)
的操作,仅当target
为构造函数时生效。
本题详细解读
Proxy 是 JavaScript 中一个强大的元编程工具,允许我们拦截并自定义对目标对象的操作。它通过创建一个代理(proxy)对象,并将其与目标(target)对象关联,从而实现对目标对象行为的拦截。
以下是对每个拦截操作的详细说明:
get(target, prop, receiver)
:- 功能: 当访问目标对象的属性时,该方法会被调用。
- 参数:
target
: 目标对象。prop
: 被访问的属性名。receiver
: Proxy 对象或继承 Proxy 的对象。
- 返回值: 被访问属性的值。
- 用途: 可以用于实现数据校验、缓存、访问日志等。
set(target, prop, value, receiver)
:- 功能: 当设置目标对象的属性时,该方法会被调用。
- 参数:
target
: 目标对象。prop
: 被设置的属性名。value
: 被设置的新值。receiver
: Proxy 对象或继承 Proxy 的对象。
- 返回值: 一个布尔值,表示属性设置操作是否成功。
- 用途: 可以用于数据验证、属性拦截、数据更新通知等。
has(target, prop)
:- 功能: 当使用
in
操作符检查目标对象是否具有某个属性时,该方法会被调用。 - 参数:
target
: 目标对象。prop
: 被检查的属性名。
- 返回值: 一个布尔值,表示目标对象是否拥有该属性。
- 用途: 可以控制哪些属性在
in
操作符中可见,隐藏某些内部属性。
- 功能: 当使用
deleteProperty(target, prop)
:- 功能: 当使用
delete
操作符删除目标对象的属性时,该方法会被调用。 - 参数:
target
: 目标对象。prop
: 被删除的属性名。
- 返回值: 一个布尔值,表示属性删除操作是否成功。
- 用途: 可以控制属性的删除行为,防止属性被删除。
- 功能: 当使用
ownKeys(target)
:- 功能: 当使用
Object.getOwnPropertyNames()
、Object.getOwnPropertySymbols()
或Object.keys()
获取目标对象的所有自有属性名时,该方法会被调用。 - 参数:
target
: 目标对象。
- 返回值: 一个包含目标对象的所有自有属性名(字符串或Symbol)的数组。
- 用途: 可以过滤或修改返回的属性列表,隐藏某些内部属性。
- 功能: 当使用
getOwnPropertyDescriptor(target, prop)
:- 功能: 当使用
Object.getOwnPropertyDescriptor()
获取目标对象的属性描述符时,该方法会被调用。 - 参数:
target
: 目标对象。prop
: 被查询的属性名。
- 返回值: 返回一个属性描述符对象,或者
undefined
如果该属性不存在。 - 用途: 可以自定义属性描述符的返回,控制属性的配置。
- 功能: 当使用
defineProperty(target, prop, descriptor)
:- 功能: 当使用
Object.defineProperty()
定义或修改目标对象的属性时,该方法会被调用。 - 参数:
target
: 目标对象。prop
: 被定义或修改的属性名。descriptor
: 新的属性描述符。
- 返回值: 一个布尔值,表示属性定义操作是否成功。
- 用途: 可以控制属性的定义和修改,防止属性被非法修改。
- 功能: 当使用
preventExtensions(target)
:- 功能: 当使用
Object.preventExtensions()
使目标对象不可扩展时,该方法会被调用。 - 参数:
target
: 目标对象。
- 返回值: 一个布尔值,表示操作是否成功。
- 用途: 拦截对象扩展,实现对象状态的锁定。
- 功能: 当使用
getPrototypeOf(target)
:- 功能: 当使用
Object.getPrototypeOf()
获取目标对象的原型时,该方法会被调用。 - 参数:
target
: 目标对象。
- 返回值: 返回目标对象的原型。
- 用途: 可以修改或替换目标对象的原型。
- 功能: 当使用
setPrototypeOf(target, prototype)
:- 功能: 当使用
Object.setPrototypeOf()
设置目标对象的原型时,该方法会被调用。 - 参数:
target
: 目标对象。prototype
: 新的原型。
- 返回值: 一个布尔值,表示操作是否成功。
- 用途: 可以拦截对原型链的修改操作。
- 功能: 当使用
isExtensible(target)
:- 功能: 当使用
Object.isExtensible()
判断目标对象是否可扩展时,该方法会被调用。 - 参数:
*
target
: 目标对象。 - 返回值: 一个布尔值,表示目标对象是否可扩展。
- 用途: 拦截对象的可扩展性判断,用于模拟对象状态。
- 功能: 当使用
apply(target, thisArg, argumentsList)
:- 功能: 当目标对象为函数,并且被调用时,该方法会被调用。
- 参数:
*
target
: 目标函数。 *thisArg
: 调用函数时的this
值。 *argumentsList
: 调用函数时传入的参数列表。 - 返回值: 函数的返回值。
- 用途: 可以拦截函数的调用,并在函数调用前后进行额外的操作,如权限校验,日志记录等。
construct(target, argumentsList, newTarget)
:- 功能: 当目标对象为构造函数,并且被
new
调用时,该方法会被调用。 - 参数:
target
: 目标构造函数。argumentsList
: 构造函数调用时传入的参数列表。newTarget
: 构造函数被new
关键字调用时的引用。
- 返回值: 返回一个实例化的对象。
- 用途: 可以拦截构造函数的调用,并在对象实例化前后进行额外操作,如初始化或参数校验。
- 功能: 当目标对象为构造函数,并且被