请列举 Proxy 对象可以拦截的操作,例如 get、set、has、deleteProperty 等。

推荐答案

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)对象关联,从而实现对目标对象行为的拦截。

以下是对每个拦截操作的详细说明:

  1. get(target, prop, receiver):

    • 功能: 当访问目标对象的属性时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prop: 被访问的属性名。
      • receiver: Proxy 对象或继承 Proxy 的对象。
    • 返回值: 被访问属性的值。
    • 用途: 可以用于实现数据校验、缓存、访问日志等。
  2. set(target, prop, value, receiver):

    • 功能: 当设置目标对象的属性时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prop: 被设置的属性名。
      • value: 被设置的新值。
      • receiver: Proxy 对象或继承 Proxy 的对象。
    • 返回值: 一个布尔值,表示属性设置操作是否成功。
    • 用途: 可以用于数据验证、属性拦截、数据更新通知等。
  3. has(target, prop):

    • 功能: 当使用 in 操作符检查目标对象是否具有某个属性时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prop: 被检查的属性名。
    • 返回值: 一个布尔值,表示目标对象是否拥有该属性。
    • 用途: 可以控制哪些属性在 in 操作符中可见,隐藏某些内部属性。
  4. deleteProperty(target, prop):

    • 功能: 当使用 delete 操作符删除目标对象的属性时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prop: 被删除的属性名。
    • 返回值: 一个布尔值,表示属性删除操作是否成功。
    • 用途: 可以控制属性的删除行为,防止属性被删除。
  5. ownKeys(target):

    • 功能: 当使用 Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.keys() 获取目标对象的所有自有属性名时,该方法会被调用。
    • 参数:
      • target: 目标对象。
    • 返回值: 一个包含目标对象的所有自有属性名(字符串或Symbol)的数组。
    • 用途: 可以过滤或修改返回的属性列表,隐藏某些内部属性。
  6. getOwnPropertyDescriptor(target, prop):

    • 功能: 当使用 Object.getOwnPropertyDescriptor() 获取目标对象的属性描述符时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prop: 被查询的属性名。
    • 返回值: 返回一个属性描述符对象,或者 undefined 如果该属性不存在。
    • 用途: 可以自定义属性描述符的返回,控制属性的配置。
  7. defineProperty(target, prop, descriptor):

    • 功能: 当使用 Object.defineProperty() 定义或修改目标对象的属性时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prop: 被定义或修改的属性名。
      • descriptor: 新的属性描述符。
    • 返回值: 一个布尔值,表示属性定义操作是否成功。
    • 用途: 可以控制属性的定义和修改,防止属性被非法修改。
  8. preventExtensions(target):

    • 功能: 当使用 Object.preventExtensions() 使目标对象不可扩展时,该方法会被调用。
    • 参数:
      • target: 目标对象。
    • 返回值: 一个布尔值,表示操作是否成功。
    • 用途: 拦截对象扩展,实现对象状态的锁定。
  9. getPrototypeOf(target):

    • 功能: 当使用 Object.getPrototypeOf() 获取目标对象的原型时,该方法会被调用。
    • 参数:
      • target: 目标对象。
    • 返回值: 返回目标对象的原型。
    • 用途: 可以修改或替换目标对象的原型。
  10. setPrototypeOf(target, prototype):

    • 功能: 当使用 Object.setPrototypeOf() 设置目标对象的原型时,该方法会被调用。
    • 参数:
      • target: 目标对象。
      • prototype: 新的原型。
    • 返回值: 一个布尔值,表示操作是否成功。
    • 用途: 可以拦截对原型链的修改操作。
  11. isExtensible(target):

    • 功能: 当使用 Object.isExtensible() 判断目标对象是否可扩展时,该方法会被调用。
    • 参数: * target: 目标对象。
    • 返回值: 一个布尔值,表示目标对象是否可扩展。
    • 用途: 拦截对象的可扩展性判断,用于模拟对象状态。
  12. apply(target, thisArg, argumentsList):

    • 功能: 当目标对象为函数,并且被调用时,该方法会被调用。
    • 参数: * target: 目标函数。 * thisArg: 调用函数时的 this 值。 * argumentsList: 调用函数时传入的参数列表。
    • 返回值: 函数的返回值。
    • 用途: 可以拦截函数的调用,并在函数调用前后进行额外的操作,如权限校验,日志记录等。
  13. construct(target, argumentsList, newTarget):

    • 功能: 当目标对象为构造函数,并且被 new 调用时,该方法会被调用。
    • 参数:
      • target: 目标构造函数。
      • argumentsList: 构造函数调用时传入的参数列表。
      • newTarget: 构造函数被 new 关键字调用时的引用。
    • 返回值: 返回一个实例化的对象。
    • 用途: 可以拦截构造函数的调用,并在对象实例化前后进行额外操作,如初始化或参数校验。
纠错
反馈