我最近了解了 ES6 代理,但我认为没有充分的理由使用它。我的意思是,一个人可以用 Proxy 做的所有事情都可以在没有它的情况下完成,除非我错过了一些东西。
例如,大多数人在谈到代理时都会谈论验证,但可以应用一些 JS 的优点来验证,每个人都很好。如果有人能让我看到代理的一些主要用例,我将不胜感激。谢谢!
我最近了解了 ES6 代理,但我认为没有充分的理由使用它。我的意思是,一个人可以用 Proxy 做的所有事情都可以在没有它的情况下完成,除非我错过了一些东西。
例如,大多数人在谈到代理时都会谈论验证,但可以应用一些 JS 的优点来验证,每个人都很好。如果有人能让我看到代理的一些主要用例,我将不胜感激。谢谢!
我的意思是,一个人可以用 Proxy 做的每一件事都可以在没有它的情况下完成......
这远不是真的。
考虑捕获对不存在的属性的访问的常见需求:
const o = {foo: "bar"};
console.log(o.blarg);
通常希望以默认方式以外的方式处理它,即记录undefined
. Proxy 让我们通过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,就没有办法解决这个问题。使用Proxy,这很容易:您可以根据要挂入的内容来使用has
陷阱或ownKeys
陷阱。
在其他用例方面:代理是实现外观模式的终极工具。寻找 Facade 的用例,你会发现 Proxy 的用例。
实际上你可以用它做很多事情。有一个很棒的 github repo,这个人把一堆代理资源放在一起,你可以查看。
https://github.com/mikaelbr/proxy-fun
另外,看看我的要点,我最近开始玩代理,我有几个非常独特的例子。您基本上可以使用代理和程序以更接近您的想法的方式构建自己的 DSL。
代理代表一类称为元编程的动态编程(如在动态语言中,而不是解决问题的方法) ,并且绝对不能在没有代理的情况下完成任何可以使用代理完成的事情。事实上,这就是代理存在的真正原因:启用以前不可能实现的全新功能。
代理使您能够拦截对象上的操作,否则这些操作将完全由 JavaScript 引擎负责;属性访问和变异是两个明显的例子。
TJ 的回答是一个很好的例子,说明没有代理就无法做到。再给你一个,我使用代理来启用目标实体的单例实例,以允许它们的支持数据存储被换出并替换为全新的对象,而不会影响指向这些对象的引用。
要在没有代理的情况下做到这一点,我们必须遍历对象的每个字段并将它们换成新对象中的新字段。虽然 JavaScript 确实具有足够的动态性,可以实现这一点,但代理允许以更优雅的方式解决它:代理的隐藏后备存储被简单地替换为新对象,并且所有未来的属性访问都被简单地定向到新的后备存储而不是旧的,而对对象的外部引用(实际上是代理)不需要更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在它背后恰好有完全不同的数据。
这只是您可以使用代理的一个示例。由于它们的动态性,它们确实非常强大。我刚刚开始了解他们,但我已经可以说我很爱了。:)
在 ES6 中,代理提供了吃蛋糕和取回蛋糕的灵活性。您不需要像在 ES5 中那样事先知道要获取/设置的属性。现在使用 ES6 Proxy,您可以像这样向对象添加新属性:proxyObj.newProp = 9
Proxy 会微笑并设置新属性而不会产生偏见。