javascript ES6代理的主要用例

olqngx59  于 2023-05-27  发布在  Java
关注(0)|答案(4)|浏览(211)

我最近开始了解ES6代理,但我没有看到一个很好的理由使用它。我的意思是,任何人可以做的代理可以没有它,除非我错过了什么。
例如,当涉及到代理时,大多数人都在谈论验证,但可以应用一些JS优点来验证,每个人都很好。如果有人能让我了解代理的一些主要用例,我将不胜感激。谢谢!

von4xj4u

von4xj4u1#

我的意思是,任何事情,一个人可以做代理可以没有它...
如果这是真的,TC39就不会添加代理。但事实上,有些事情你不能没有代理。
考虑捕获对不存在的属性的访问的常见需求:

const o = {foo: "bar"};
console.log(o.blarg);

通常希望以一种不同于默认的方式来处理它,默认方式是访问o.blarg以得到undefined。代理让我们通过get trap做到这一点。示例:

const o = {foo: "bar"};
const p = new Proxy(o, {
  get(target, prop, receiver) {
    return prop in target ? target[prop] : "nifty!";
  }
});
console.log(p.foo);
console.log(p.blarg);

另一个例子是挂钩到获取对象属性列表的各种操作的能力。没有代理就无法连接到它。* 有了 * Proxy,很简单:您可以使用has trapownKeys trap,这取决于您想要挂接的对象。
在其他用例方面:Proxy是实现Facade pattern的最终工具。查找Facade的用例,您将找到Proxy的用例。

a0zr77ik

a0zr77ik2#

实际上,你可以用它做很多事情。有一个很棒的github repo,这个家伙把一堆代理资源放在一起,你可以查看。
https://github.com/mikaelbr/proxy-fun
另外,看看我的gist,我最近开始玩代理,我有几个例子是非常独特的。实际上,您可以使用代理和程序以更接近您的方式构建自己的DSL。
https://gist.github.com/jasuperior

vs91vp4v

vs91vp4v3#

代理代表一类称为metaprogramming的动态编程(如dynamic languages,而不是method of problem solving),并且绝对不是可以使用代理完成的任何事情都可以在没有代理的情况下完成。事实上,这就是代理存在的真正原因:来实现以前不可能实现的全新功能。
代理使您能够拦截对象上的操作,否则这些操作将完全由JavaScript引擎负责;属性访问和变更是两个明显的例子。
T. J.的回答是一个很好的例子,说明了没有代理就做不到的事情。再给予一个例子,我使用代理来启用对象实体的单例示例,以允许它们的后台数据存储被替换出来并替换为全新的对象,而不会影响指向这些对象的引用。
要在没有代理的情况下做到这一点,我们必须迭代对象的每个字段,并将它们交换为新对象中的新字段。虽然JavaScript确实足够动态,可以实现这一点,但代理允许以一种更优雅的方式解决这个问题:代理的隐藏后备存储器被简单地替换为新对象,并且所有将来的属性访问被简单地指向新后备存储器而不是旧后备存储器,而对对象(其实际上是代理)的外部引用不需要更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在它背后碰巧有完全不同的数据。
这只是一个使用代理的示例。他们真的很强大,因为他们是多么动态。我刚开始了解他们,但我已经可以说我很爱他们了。:)

55ooxyrt

55ooxyrt4#

在ES6中,Proxy提供了吃蛋糕和收回蛋糕的灵活性。你不需要像在ES 5中那样预先知道要获取/设置的属性。现在使用ES6 Proxy,你可以像这样为对象添加新的属性:proxyObj.newProp = 9,代理将微笑,并设置新的属性没有偏见。

相关问题