JavaScript 中的对象是有用的数据类型,让我们可以使用简单的键值对定义复杂的数据,例如字典。有时,您可能想要更改 JavaScript 对象的默认工作方式。这就是代理对象有用的地方。在本文中,我们将讨论什么是代理对象、它们为何有用以及如何使用它们。
在了解什么是代理对象之前,我们先来看看代理这个词。代理意味着行为类似于原始事物但不是原始事物的事物。同样,代理对象是使用原始对象创建的对象,它可以拦截并更改原始对象的工作方式。
Proxy 构造函数有两个参数
目标:要为其创建代理的对象
处理程序:包含要更改或重新定义的操作的对象
const proxyObject = new Proxy(target, handler)
当我们使用具有您想要更改的操作的处理程序创建代理对象时,它会拦截这些操作,捕获对目标对象的调用,并运行您为这些操作定义的自定义逻辑。
这些操作称为陷阱,基本上是对象的内部方法。其中一些是:
获取
设置
删除属性
在这里,我创建了一个简单的视觉效果,展示了代理对象的工作原理。如果我们尝试访问或设置一个值,它会拦截并运行处理程序中定义的操作(陷阱)。
好吧,我希望代理对象的内容和方式都清楚了。接下来,我们将讨论一些用例来展示代理对象为何有用。
假设您想要创建一个系统,每次从对象访问属性时,它都会记录信息。
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 proxyObject = new Proxy(target, handler)
您可能想知道 Reflect.set(target, key, value) 是什么。它是一个命名空间对象,具有静态方法,用于调用可被拦截的 JavaScript 对象的内部方法。如果您不想验证所有属性,可以使用 Reflect 对象来保留默认行为。
我们讨论了日志记录和验证两个用例,但您可以根据需要拦截其他内部方法。
我们讨论了代理对象是什么、它如何工作以及它的一些用途。代理对象很有帮助,但我们应该意识到它的缺点。我们应该仅在必要时使用它,以避免错误地增加复杂性或错误。
这就是本主题的全部内容。感谢您的阅读!如果您觉得本文有帮助,请考虑点赞、评论并分享给其他人。
MDN 代理文档
MDN 反射文档
以上是如何在 JavaScript 中使用代理对象的详细内容。更多信息请关注PHP中文网其他相关文章!