寻找当原型被密封时填充对象的技巧

问题描述 投票:0回答:1

在我的环境(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 实现? 我一直在尝试这样做,但并没有带来任何合规的结果。

javascript ecmascript-6 salesforce shim
1个回答
1
投票

es6-shim
是一个polyfill,如果原型被密封,肯定会失败,因为它应该修改它们。

这里需要的方法是ponyfill。正如描述所说,

一般来说,您不应该修改不属于您的API。

相比之下,ponyfill 不会猴子修补任何内容,而是将功能导出为普通模块,因此您可以在本地使用它而不会影响其他代码。

tl;博士; Polyfills 很顽皮,因为它们修补了本机 API,而 ponyfills 是纯粹的,不会影响环境。

其中一些在 NPM 上标有

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');
© www.soinside.com 2019 - 2024. All rights reserved.