使用本地reduce代替原型1.6.0.3的reduce。

4

我正在开发一个第三方小部件,我的js使用本地的reduce函数。

但是,当我把它放到客户页面上时,它会有1.6.0.3版本的prototype库并且覆盖了reduce函数,做了一些完全意想不到的事情。

我该如何让我的JS使用本地的reduce函数呢?

谢谢


在原型加载之前将 Array.prototype.reduce 存储在一个变量中,然后重置 reduce - Florent
问题在于作为第三方JS,我无法控制客户端将我的脚本放置在prototype.js的上方还是下方。 - Cleyton
1
你能否请求更新PrototypeJS到1.7.1版本?该版本在覆盖本地reduce之前检查其是否存在,并修复了许多其他错误。 - Geek Num 88
不行,因为这可能会影响客户网站的其他部分,他不想冒这个风险。 - Cleyton
1
是的,Prototype.js 自己的实现最奇怪的事情是它做了一件绝对愚蠢的事情:reduce: function() { return this.length > 1 ? this : this[0]; } 真是令人匪夷所思! - tsds
2个回答

1
进一步解释Florent的评论:

<script type="text/javascript">
    Array.prototype.nativeReduce = Array.prototype.reduce;
</script>
<script type="text/javascript" src="/path/to/prototype.js"></script>

现在您可以像这样调用原生reduce方法:
var x = [];

x.nativeReduce(...);

如果您无法控制脚本导入的顺序,那么一个 iframe 可能是一个解决办法,至少可以再次访问原生的 reduce 函数。
(function (document) {
    var iframe = document.createElement("iframe");

    iframe.src = "about:blank";
    iframe.style.display = "none";
    document.documentElement.appendChild(iframe);

    var reduce = iframe.contentWindow.Array.prototype.reduce;

    // Rest of your script goes here

    var arr = [1, 2, 3];
    reduce.call(arr, function() { ... });
})(this.document);

问题在于作为第三方JS,我无法控制客户端将我的脚本放置在prototype.js的上方还是下方。 - Cleyton
@Cleyton:我回复你的评论已经晚了5年,但我找到了一个解决方法并更新了我的答案。 - Greg Burghardt

0

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