IE11的ES6代理Polyfill

37

IE11不支持ES2015代理对象,也不会支持。然而,IE11的扩展支持将于2025年10月14日结束。

有没有办法为IE11提供代理对象的polyfill?所有其他浏览器都已经支持Proxy了。

如果可以,那么今天我们都可以在生产中使用它。如果不能,那么我们将不得不等待将近十年...

编辑:我特别问及IE11,因为我知道IE通常具有我经常不知道的IE特定功能。

编辑2:我特别希望能够实现一个catch-all拦截器。类似于Python中的__getattr__。它只需要在IE11中工作。


1
一个简短的搜索显示,有github: GoogleChrome/proxy-polyfill。你至少应该参考这个并说明它为什么不足够。 - t.niese
11
Proxy 是 ES6 全新的引擎级特性,它无法通过 polyfill 实现。如果要使用 Proxy,就必须放弃对 IE11 的支持。 - loganfsmyth
5
@loganfsmyth 事实上,你可以编写一个 Babel 插件将每个 object.prop = 1 改为 set(object, 'prop', 1),并将每个 object.prop 改为 get(object, 'prop')。所以这并非不可能,但问题在于它会带来性能上的劣势。(虽然我不知道会有多糟糕。) - brillout
2
没错,但那不是一个 polyfill,那是语法转换。如果你在代码中使用计算属性,它也会失败。 - loganfsmyth
2
我不太建议现在使用“真正”的代理对象,因为它们因为尚未被引擎优化而被认为是相当慢的。 - loganfsmyth
显示剩余9条评论
3个回答

20

4
我正在寻找一个IE11的polyfill,而不是ES5的polyfill,这个在原始帖子中已经重复多次。你提到的库不支持 catch-all getters(捕捉所有的getter)。再次强调,原始帖子明确提到了对catch-all getters(捕捉所有的getter)的兴趣。 - brillout
5
据我所记和理解,根据 Babel 团队的说法,由于 ES5(IE11 也使用)的限制,完全实现代理 polyfill 是不可能的。代理应该在引擎层面上实现。这就是我试图解释的内容,当我谈到这个库是你能够得到的最好的时候。更多信息请参见:在 babel 上的 github 评论quora 上类似的问题 - Dolf Barr
此外,类似的问题:https://dev59.com/f3E95IYBdhLWcg3wUcVnhttps://dev59.com/4nNA5IYBdhLWcg3wWseK - Dolf Barr
1
根据您的问题,也许应该是“如何实现一个兼容IE11的全局拦截器”,而不是“针对IE11的ES6代理填充”? - Dolf Barr
1
根据GoogleChrome/proxy-polyfill support部分的说明,这应该可以在**ie9+**上运行。 - Will Farley

9

在Quora上有一个相当简洁的回答这个问题的答案

代理需要在引擎级别上得到支持,无法填充代理。

大多数主要的JS引擎尚未实现支持。查看ECMAScript 6兼容性表

您可能想使用Object.observe,可能需要为Chrome以外的浏览器提供填充,但即使如此,该提案也已被撤回,并宣布将在将来的版本中从Chrome中删除。

我个人尚未尝试Object.observe解决方案,但这可能是一个很好的起点。

祝你好运!

编辑: 感谢评论区的Matt Jensen指出,事实上有一种方法可以使用此软件包填充ES6 Proxy的某些部分:github.com/GoogleChrome/proxy-polyfill

太棒了


@Dolf 你这个问题解决了吗? - George
1
IE11不支持Object.observe。 - Joe Maffei
2
并非完全正确。代理 API 的许多部分都可以进行 polyfill。请参见:https://github.com/GoogleChrome/proxy-polyfill - Matt Jensen

-5

在不支持ES6 Proxy特性的环境中实现Polyfill的直接解决方案是不可能的-如果想要存储一些polyfill函数信息,可以使用window.Proxy。但是,如果这样思考,大多数ES6的现代特性都无法被支持,因为它们会对旧版本的ECMAScript引擎产生语法错误。

这就是为什么你应该使用转译器,它将先前封装ES6代码到特定结构中,并在旧引擎上评估转换后的代码。在当前情况下,只需使用一个Babel插件:https://www.npmjs.com/package/babel-plugin-proxy

当然,使用此解决方案时,应该配置Webpack以针对不同的客户端代理/浏览器隔离目标捆绑包,具体取决于其功能集发现。有关详细信息,请参见此处:https://gist.github.com/newyankeecodeshop/79f3e1348a09583faf62ed55b58d09d9


1
如果没有可用的 polyfill,转译器就无能为力。你指向的插件使用了转译器和 polyfill 的组合,将所有属性访问重写为通过代理进行,这将非常缓慢。 - Gordon Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接