我最近了解了ES6代理,但我没有看到使用它的充分理由。我的意思是,除非我遗漏了什么,否则可以在没有它的情况下完成所有可以使用Proxy的操作。
例如,大多数人谈论代理时的验证,但是可以应用一些JS优点来验证,每个人都很好。如果有人可以睁开眼睛看看代理的一些主要用例,我将不胜感激。谢谢!
答案 0 :(得分:12)
我的意思是,可以在没有它的情况下完成与Proxy相关的所有事情......
这远非如此。
考虑一般需要访问不存在的属性:
const o = {foo: "bar"};
console.log(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);

另一个例子是能够挂钩获取对象属性列表的各种操作。没有代理就没有办法挂钩。 使用代理,很简单:根据您要隐藏的内容,使用has
trap或ownKeys
trap。
就其他用例而言:代理是实现Facade模式的终极工具。查看Facade的用例,您将找到Proxy的用例。
答案 1 :(得分:2)
实际上你可以做很多事情。这是一个很棒的github repo,这个人把一堆代理资源放在一起,你可以查看。
https://github.com/mikaelbr/proxy-fun
另外,看看我的要点,我最近开始玩代理,我有几个非常独特的例子。实际上,您可以使用代理和程序以与您的思维方式更接近的方式构建自己的DSL。
答案 2 :(得分:1)
代理代表一类动态编程(如在dynamic languages中,而不是method of problem solving),称为metaprogramming,并且绝对不是任何可以用代理完成的事情都可以没有他们就完成了。事实上,代理存在的真正原因是:启用以前无法实现的全新功能。
代理使您能够拦截对象上的操作,否则这些操作纯粹是JavaScript引擎的责任;属性访问和变异是两个明显的例子。
T.J。的回答是一个很好的例子,你可以做一些没有代理的事情。为了给你另一个,我使用代理来启用目标实体的单例实例,以允许它们的后备数据存储被换出并替换为全新的对象,而不会影响指向这些对象的引用。
要在没有代理的情况下执行此操作,我们必须迭代对象的每个字段并将它们换成新对象中的新字段。虽然真正的JavaScript足够动态以允许它成为可能,但代理允许以更优雅的方式解决它:代理的隐藏后备存储被简单地替换为新对象和所有未来的属性访问简单地指向新的后备存储而不是旧的后备存储,而对对象(实际上是代理)的外部引用不需要更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在碰巧有完全不同的数据。
这只是您可以使用Proxies的一个示例。由于它们的动态性,它们确实非常强大。我只是去了解他们,但我已经可以说我已经恋爱了。 :)
答案 3 :(得分:-1)
在ES6代理中,您可以灵活地吃蛋糕并将其取回。您不需要事先知道将在ES5中获取/设置的属性。
现在使用ES6代理,您可以向对象添加新属性,如:proxyObj.newProp = 9
,代理将微笑并设置新属性而不会产生偏见。