ES6 代理的主要用例
Major use cases for ES6 proxies
我最近了解了 ES6 代理,但我没有找到使用它的充分理由。我的意思是,使用 Proxy 可以做的所有事情都可以在没有它的情况下完成,除非我遗漏了什么。
例如,大多数人在谈到代理时都会谈论验证,但可以应用一些 JS 优点来验证,每个人都很好。如果有人能让我看到代理的一些主要用例,我将不胜感激。谢谢!
I mean, every thing that one could do with Proxy can be done without it...
事实并非如此。
考虑捕获对不存在的属性的访问的常见需求:
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);
另一个例子是能够挂钩获取对象属性列表的各种操作。没有代理就无法挂钩。 使用 代理,这很简单:您可以使用has
trap or the ownKeys
trap,具体取决于您要连接的内容。
在其他用例方面:Proxy是实现Facade模式的终极工具。寻找 Facade 的用例,您会找到 Proxy 的用例。
代理代表了动态规划的class(如dynamic languages, not the method of problem solving) called metaprogramming,绝对不是任何可以用代理完成的事情都可以在没有它们的情况下完成。事实上,这确实是代理存在的原因:启用以前不可能实现的全新功能。
代理使您能够拦截对对象的操作,否则这些操作纯粹由 JavaScript 引擎负责; 属性 访问和变异是两个明显的例子。
T.J. 的回答很好地说明了没有代理就无法做到的事情。另外,我正在使用代理来启用 objective 实体的单例实例,以允许它们的后备数据存储被换出并替换为全新的对象,而不会影响指向这些对象的引用。
要在没有代理的情况下做到这一点,我们必须遍历对象的每个字段并将它们换出新对象中的新字段。虽然 JavaScript 是动态的,足以让这成为可能,但代理允许以更优雅的方式解决它:代理的隐藏后备存储被简单地替换为新对象和所有未来 属性 访问只是定向到新的后备存储而不是旧的,而对对象(实际上是代理)的外部引用需要 none 更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在恰好背后有完全不同的数据。
这只是代理的用途之一。它们真的非常强大,因为它们充满活力。我才刚刚开始了解他们,但我已经可以说我很爱他们了。 :)
实际上您可以用它做很多事情。有一个很棒的 github 存储库,这个人将一堆代理资源放在一起,您可以查看这些资源。
https://github.com/mikaelbr/proxy-fun
此外,请查看我的要点,我最近开始使用代理,我有几个非常独特的例子。您基本上可以使用代理和程序以更接近您的想法的方式构建自己的 DSL。
在 ES6 中,代理提供了吃蛋糕和取回蛋糕的灵活性。您不需要像在 ES5 中那样事先知道属性将是 get/set。
现在使用 ES6 Proxy,您可以像这样向对象添加新的 属性:proxyObj.newProp = 9
,Proxy 将微笑并设置新的 属性 而不带偏见。
我最近了解了 ES6 代理,但我没有找到使用它的充分理由。我的意思是,使用 Proxy 可以做的所有事情都可以在没有它的情况下完成,除非我遗漏了什么。
例如,大多数人在谈到代理时都会谈论验证,但可以应用一些 JS 优点来验证,每个人都很好。如果有人能让我看到代理的一些主要用例,我将不胜感激。谢谢!
I mean, every thing that one could do with Proxy can be done without it...
事实并非如此。
考虑捕获对不存在的属性的访问的常见需求:
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);
另一个例子是能够挂钩获取对象属性列表的各种操作。没有代理就无法挂钩。 使用 代理,这很简单:您可以使用has
trap or the ownKeys
trap,具体取决于您要连接的内容。
在其他用例方面:Proxy是实现Facade模式的终极工具。寻找 Facade 的用例,您会找到 Proxy 的用例。
代理代表了动态规划的class(如dynamic languages, not the method of problem solving) called metaprogramming,绝对不是任何可以用代理完成的事情都可以在没有它们的情况下完成。事实上,这确实是代理存在的原因:启用以前不可能实现的全新功能。
代理使您能够拦截对对象的操作,否则这些操作纯粹由 JavaScript 引擎负责; 属性 访问和变异是两个明显的例子。
T.J. 的回答很好地说明了没有代理就无法做到的事情。另外,我正在使用代理来启用 objective 实体的单例实例,以允许它们的后备数据存储被换出并替换为全新的对象,而不会影响指向这些对象的引用。
要在没有代理的情况下做到这一点,我们必须遍历对象的每个字段并将它们换出新对象中的新字段。虽然 JavaScript 是动态的,足以让这成为可能,但代理允许以更优雅的方式解决它:代理的隐藏后备存储被简单地替换为新对象和所有未来 属性 访问只是定向到新的后备存储而不是旧的,而对对象(实际上是代理)的外部引用需要 none 更明智。对他们来说,它看起来好像是同一个对象(因为它是),但现在恰好背后有完全不同的数据。
这只是代理的用途之一。它们真的非常强大,因为它们充满活力。我才刚刚开始了解他们,但我已经可以说我很爱他们了。 :)
实际上您可以用它做很多事情。有一个很棒的 github 存储库,这个人将一堆代理资源放在一起,您可以查看这些资源。
https://github.com/mikaelbr/proxy-fun
此外,请查看我的要点,我最近开始使用代理,我有几个非常独特的例子。您基本上可以使用代理和程序以更接近您的想法的方式构建自己的 DSL。
在 ES6 中,代理提供了吃蛋糕和取回蛋糕的灵活性。您不需要像在 ES5 中那样事先知道属性将是 get/set。
现在使用 ES6 Proxy,您可以像这样向对象添加新的 属性:proxyObj.newProp = 9
,Proxy 将微笑并设置新的 属性 而不带偏见。