推荐答案
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关键字调用时的引用。
- 返回值: 返回一个实例化的对象。
- 用途: 可以拦截构造函数的调用,并在对象实例化前后进行额外操作,如初始化或参数校验。
- 功能: 当目标对象为构造函数,并且被