在我的上下文中,String和String.prototype,Array和Array.prototype,Object和Object.prototype是密封的。我无法控制这种密封。 我的上下文只支持ES5,我想使用ES6 shim(https://github.com/paulmillr/es6-shim)来使用ES6 gracefull方法,比如find(),reduce()甚至startsWith()......
我不能使用这些垫片,因为当我尝试添加或编辑原型时会抛出错误。你知道一些技巧可以绕过这个限制。我的意思是使用Array.prototype.find()而不提供我自己的实现。
例如,在能够使用ES6功能之前,我可以使用新的ES6Array([])的解决方案对我来说将是一个合适的解决方案。我只是想避免自己实现Shims。我想尽可能多地使用paulmillr实现。
是否可以使用阴影黑客来使用paulmillr实现? 我一直在努力做到这一点,但它不会导致任何合规的结果。
PS:这是Salesforce Commerce Cloud上下文
答案 0 :(得分:1)
es6-shim
是一个polyfill,如果原型被密封肯定会失败,因为它应该修改它们。
此处需要的方法是ponyfill。正如描述所说,
一般情况下,您不应修改您不拥有的API。
相反,ponyfill并不会修补任何东西,而是将功能导出为普通模块,因此您可以在本地使用它而不会影响其他代码。TL;博士; Polyfills在修补原生API时很顽皮,而ponyfill是纯净的,不会影响环境。
其中一些标签在NPM上标有ponyfill
keyword。
core-js
提供doesn't pollute global namespace的库版本,因此可以用作ponyfill,因此通常没有理由进一步查看:
import * as find from 'core-js/library/fn/array/find';
find(array, 'foo')
请注意,某些core-js/library
导出是polyfilled实现(Promise
,Map
等):
import { Promise as PolyfilledPromise } from 'core-js/library';
PolyfilledPromise.resolve();
虽然其他方法是polyfilled方法的集合,但因为它们不切实际或不可能为它们提供独立实现(Array
,Object
):
import { Array as arrayPonyfills } from 'core-js/library';
const { find } = arrayPonyfills;
find.call(array, 'foo');