如何在 JavaScript 中使用代理对象

javascript 中的对象是有用的数据类型,让我们可以使用简单的键值对定义复杂的数据,例如字典。有时,您可能想要更改 javascript 对象的默认工作方式。这就是代理对象有用的地方。在本文中,我们将讨论什么是代理对象、它们为何有用以及如何使用它们。

什么是代理对象?

在了解什么是代理对象之前,我们先来看看代理这个词。代理意味着行为类似于原始事物但不是原始事物的事物。同样,代理对象是使用原始对象创建的对象,它可以拦截并更改原始对象的工作方式。

proxy 构造函数有两个参数

  • 目标:要为其创建代理的对象

  • 处理程序:包含要更改或重新定义的操作的对象

const proxyobject = new proxy(target, handler)

代理对象如何工作?

当我们使用具有您想要更改的操作的处理程序创建代理对象时,它会拦截这些操作,捕获对目标对象的调用,并运行您为这些操作定义的自定义逻辑。

这些操作称为陷阱,基本上是对象的内部方法。其中一些是:

  • 获取

  • 设置

  • 删除属性

如何在 JavaScript 中使用代理对象

在这里,我创建了一个简单的视觉效果,展示了代理对象的工作原理。如果我们尝试访问或设置一个值,它会拦截并运行处理程序中定义的操作(陷阱)。

好吧,我希望代理对象的内容和方式都清楚了。接下来,我们将讨论一些用例来展示代理对象为何有用。

代理对象的用例

记录

假设您想要创建一个系统,每次从对象访问属性时,它都会记录信息。

const platform = {
  type: "peerlist.io",
  handle: "sachin87",
};

const proxyplatformobj = new proxy(platform, {
  get(target, key) {
    console.log(`[info]: accessing ${key} at ${date.now()}`);
    return target[key];
  },
});

// try to access the property
proxyplatformobj.type;

// [info]: accessing type at 1729661722827

// 'peerlist.io'

这是一个非常简单的用例,但在需要日志记录时很有用,并且您可以扩展它以执行更高级的操作。

我们还可以让用户访问不直接可用的属性。例如,在上面的例子中,我们可能需要平台的完整 url 以及用户句柄。

const proxyplatformobj = new proxy(platform, {
  get(target, key) {
    console.log(`[info]: accessing ${key} at ${date.now()}`);
    if (key === "url") {
      return `https://${target.type}/${target.handle}`;
    }
    return target[key];
  },
});

// try to access the url property
proxyplatformobj.url;

// [info]: accessing url at 1729662118855
// 'https://peerlist.io/sachin87'

验证

另一个用例是在添加值之前检查该值。例如,假设我们要在设置句柄之前检查它的值。我们将验证两个基本条件:

  • 应该是小写

  • 可以是字母数字

const proxyPlatformObj = new Proxy(platform, {
  set(target, key, value) {
    if (key === "handle" && !(/^[a-z0-9]+$/.test(value))) {
      console.error(`[Error]: ${key} should be in small case and can be alphanumerical`);
    } else {
      return Reflect.set(target, key, value);
    }
  },
});

proxyPlatformObj.handle="Sachin87"
// [Error]: handle should be in small case and can be alphanumerical

您可能想知道 reflect.set(target, key, value) 是什么。它是一个命名空间对象,具有静态方法,用于调用可被拦截的 javascript 对象的内部方法。如果您不想验证所有属性,可以使用 reflect 对象来保留默认行为。

我们讨论了日志记录和验证两个用例,但您可以根据需要拦截其他内部方法。

结论

我们讨论了代理对象是什么、它如何工作以及它的一些用途。代理对象很有帮助,但我们应该意识到它的缺点。我们应该仅在必要时使用它,以避免错误地增加复杂性或错误。

这就是本主题的全部内容。感谢您的阅读!如果您觉得本文有帮助,请考虑点赞、评论并分享给其他人。

延伸阅读

  • mdn 代理文档

  • mdn 反射文档

以上就是如何在 JavaScript 中使用代理对象的详细内容,更多请关注其它相关文章!