代理代表一类称为metaprogramming的动态编程(如dynamic languages,而不是method of problem solving),并且绝对不是可以使用代理完成的任何事情都可以在没有代理的情况下完成。事实上,这就是代理存在的真正原因:来实现以前不可能实现的全新功能。 代理使您能够拦截对象上的操作,否则这些操作将完全由JavaScript引擎负责;属性访问和变更是两个明显的例子。 T. J.的回答是一个很好的例子,说明了没有代理就做不到的事情。再给予一个例子,我使用代理来启用对象实体的单例示例,以允许它们的后台数据存储被替换出来并替换为全新的对象,而不会影响指向这些对象的引用。 要在没有代理的情况下做到这一点,我们必须迭代对象的每个字段,并将它们交换为新对象中的新字段。虽然JavaScript确实足够动态,可以实现这一点,但代理允许以一种更优雅的方式解决这个问题:代理的隐藏后备存储器被简单地替换为新对象,并且所有将来的属性访问被简单地指向新后备存储器而不是旧后备存储器,而对对象(其实际上是代理)的外部引用不需要更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在它背后碰巧有完全不同的数据。 这只是一个使用代理的示例。他们真的很强大,因为他们是多么动态。我刚开始了解他们,但我已经可以说我很爱他们了。:)
4条答案
按热度按时间von4xj4u1#
我的意思是,任何事情,一个人可以做代理可以没有它...
如果这是真的,TC39就不会添加代理。但事实上,有些事情你不能没有代理。
考虑捕获对不存在的属性的访问的常见需求:
通常希望以一种不同于默认的方式来处理它,默认方式是访问
o.blarg
以得到undefined
。代理让我们通过get
trap做到这一点。示例:另一个例子是挂钩到获取对象属性列表的各种操作的能力。没有代理就无法连接到它。* 有了 * Proxy,很简单:您可以使用
has
trap或ownKeys
trap,这取决于您想要挂接的对象。在其他用例方面:Proxy是实现Facade pattern的最终工具。查找Facade的用例,您将找到Proxy的用例。
a0zr77ik2#
实际上,你可以用它做很多事情。有一个很棒的github repo,这个家伙把一堆代理资源放在一起,你可以查看。
https://github.com/mikaelbr/proxy-fun
另外,看看我的gist,我最近开始玩代理,我有几个例子是非常独特的。实际上,您可以使用代理和程序以更接近您的方式构建自己的DSL。
https://gist.github.com/jasuperior
vs91vp4v3#
代理代表一类称为metaprogramming的动态编程(如dynamic languages,而不是method of problem solving),并且绝对不是可以使用代理完成的任何事情都可以在没有代理的情况下完成。事实上,这就是代理存在的真正原因:来实现以前不可能实现的全新功能。
代理使您能够拦截对象上的操作,否则这些操作将完全由JavaScript引擎负责;属性访问和变更是两个明显的例子。
T. J.的回答是一个很好的例子,说明了没有代理就做不到的事情。再给予一个例子,我使用代理来启用对象实体的单例示例,以允许它们的后台数据存储被替换出来并替换为全新的对象,而不会影响指向这些对象的引用。
要在没有代理的情况下做到这一点,我们必须迭代对象的每个字段,并将它们交换为新对象中的新字段。虽然JavaScript确实足够动态,可以实现这一点,但代理允许以一种更优雅的方式解决这个问题:代理的隐藏后备存储器被简单地替换为新对象,并且所有将来的属性访问被简单地指向新后备存储器而不是旧后备存储器,而对对象(其实际上是代理)的外部引用不需要更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在它背后碰巧有完全不同的数据。
这只是一个使用代理的示例。他们真的很强大,因为他们是多么动态。我刚开始了解他们,但我已经可以说我很爱他们了。:)
55ooxyrt4#
在ES6中,Proxy提供了吃蛋糕和收回蛋糕的灵活性。你不需要像在ES 5中那样预先知道要获取/设置的属性。现在使用ES6 Proxy,你可以像这样为对象添加新的属性:
proxyObj.newProp = 9
,代理将微笑,并设置新的属性没有偏见。