【问题标题】:How to use native (not overwrote) method如何使用本机(未覆盖)方法
【发布时间】:2017-01-13 04:44:34
【问题描述】:

我的服务没有标准问题。

我在客户网站上的 SaaS 脚本中使用了 Zepto 库。但是 2 小时前,我的一位客户写信给我,说我的脚本不起作用。我检查了所有代码,发现:他使用Prototype JavaScript framework, version 1.7。在这段代码中我看到:

var Enumerable = (function() {
...
  function each(iterator, context) {...}
  function all(iterator, context) {...}
...    
}();

我的意思是,所有本机数组方法都被覆盖了。 Zepto.js 使用这个原生方法:

each: function(callback){
    emptyArray.every.call(this, function(el, idx){
        return callback.call(el, idx, el) !== false
    })
    return this
},

在哪里

emptyArray = [];

我认为这个版本的原型库有一些错误,因为(来自控制台:)

xxx:xxx Uncaught RangeError: Maximum call stack size exceeded

Zepto 的 emtyArray.each 和 Enumerable.all 函数有圆。

我的问题是,我怎样才能使用方法[].all 而不是覆盖[].prototype.all

更新

var words = ['hello', 'world', '!'];

console.log('Before overwrite');
[].every.call(words, function(el, idx) {
  console.log(el);
});

Array.prototype.every = function(iterator, context)
{
  console.error('not works');
}

console.log('After overwrite');
[].every.call(words, function(el, idx) {
  console.log(el);
});

如何再次使用原生的.every?

【问题讨论】:

  • 两个库中哪个先加载?
  • 原型。在加载此库之前,我无法执行 var baseEach = Array.prototype.each 之类的操作 =(
  • 您能否展示导致此错误的代码部分?链接你的库,提供一个小提琴。重现/调试问题的东西。
  • 这个问题不仅仅在原型 1.7 中。问题是任何脚本都可以覆盖任何本机函数和方法。我需要找到一些方法来使用这些函数和方法的真正稳定的本机版本。
  • 我找到了解决方案:stackoverflow.com/questions/8580431/…

标签: javascript prototypejs zepto


【解决方案1】:

在代码 sn-p 中不允许使用 iframe,但这是可行的变体:

Array.prototype.every = function()
{
  console.log('invalid');
}

var iframe = window.document.createElement("iframe");
window.document.documentElement.appendChild(iframe);
var nativeWnd = iframe.contentWindow;
var nativeArray = nativeWnd.Array;
var parent = iframe.parentNode || iframe.parent;
parent.removeChild(iframe);

var oArr = new Array();
var nArr = new nativeArray();

console.log(oArr.every);
console.log(nArr.every);

【讨论】:

猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多