如何在 JavaScript 中使用代理对象
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 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 中使用代理对象的详细内容,更多请关注其它相关文章!