在我的环境(Salesforce Commerce Cloud)中,
String
和String.prototype
、Array
和Array.prototype
、Object
和Object.prototype
被密封。我无法控制这种密封。
我的环境仅支持 ES5,我想使用 ES6 shim (https://github.com/paulmillr/es6-shim) 以便能够使用方便的 ES6 方法,如
find()
、reduce()
甚至startsWith()
...
我无法使用这些垫片,因为当我尝试增强原型时会抛出错误。你知道有什么技巧可以绕过这个限制吗?我的意思是使用
Array.prototype.find()
而不提供我自己的实现。
例如,在能够使用 ES6 函数之前我可以使用
new ES6Array([])
的解决方案对我来说是一个合适的解决方案。我只是想避免自己实现垫片。我想尽可能使用 paulmillr 实现。
是否可以使用影子黑客来使用 paulmillr 实现? 我一直在尝试这样做,但并没有带来任何合规的结果。
es6-shim
是一个polyfill,如果原型被密封,肯定会失败,因为它应该修改它们。
这里需要的方法是ponyfill。正如描述所说,
一般来说,您不应该修改不属于您的API。
相比之下,ponyfill 不会猴子修补任何内容,而是将功能导出为普通模块,因此您可以在本地使用它而不会影响其他代码。
tl;博士; Polyfills 很顽皮,因为它们修补了本机 API,而 ponyfills 是纯粹的,不会影响环境。
ponyfill
关键字。
core-js
提供了它的库版本,不会污染全局命名空间,因此可以用作 ponyfill,所以通常没有理由再进一步寻找:
import * as find from 'core-js/library/fn/array/find';
find(array, 'foo')
请注意,某些
core-js/library
导出是多填充实现(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');