Javascript MDN函数原型绑定polyfill在数组中是可枚举的

时间:2014-12-02 11:37:01

标签: javascript jquery internet-explorer-8

我正在开发一个项目,在该项目中我创建了一个jQuery插件和各种其他js文件,这些文件在不同的地方使用bind()。 客户端要求IE8支持,所以我们包含了一些功能polyfill来支持ie8 但在IE8循环中,如下所示,这些方法是可枚举的,会导致数据损坏。

for (var d in this.originalResponse.timespans) {}

特别是我们的问题是关于bind(),这里是我们正在使用的mdn polyfill

if (!Function.prototype.bind) {
  Function.prototype.bind = function(oThis) {
    if (typeof this !== 'function') {
      // closest thing possible to the ECMAScript 5
      // internal IsCallable function
      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
    }

    var aArgs   = Array.prototype.slice.call(arguments, 1),
        fToBind = this,
        fNOP    = function() {},
        fBound  = function() {
          return fToBind.apply(this instanceof fNOP && oThis
                 ? this
                 : oThis,
                 aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

迭代的结果将使用不需要的绑定原型进行额外的迭代。 有没有办法在IE8上支持绑定方法而不是可枚举的?

更新

this.originalResponse.timespans结构是一个对象,其中键是一个unix时间戳,值是一个字符串数组。当我试图遍历这个时,我得到了额外的迭代,因为polyfill(由于我不知道的原因)在对象中创建了一个可枚举的函数原型。

更新2

从ajax / json调用接收数据,这是来自服务器的示例数据结构:

{  
   "timespans":[  
      {  
         "1417685819":[  

         ]
      },
      {  
         "1417772219":[  

         ]
      },
      {  
         "1417858619":[  

         ]
      }
   ],
   "start":"7:00",
   "current":"11:36",
   "end":"23:00"
}

为了简单起见,在接收到这些数据后,我将数据结构转换为:

MyClass.prototype.success = function( r ) {

    var response = {
        timespans:{}
    };

    response.start = r.start;
    response.end = r.end;
    response.current = r.current;

    for (var t in r.timespans) 
    {

        for (var tt in r.timespans[t])
        {
            response.timespans[tt] = r.timespans[t][tt];
        }
    }  

    var that = this;
    this.originalResponse = response;
    // other code doing some calculation based on this.originalResponse;


 }

1 个答案:

答案 0 :(得分:0)

如果您支持不支持Object.defineProperty的旧浏览器,那么我担心这是不可能的。

if (!Function.prototype.bind) {
    Object.defineProperty(Function.prototype, 'bind', {
        value: function() {
            // function body here
        }
    });
}

使用Object.defineProperty,默认情况下,属性/方法不可枚举(不会在枚举中显示),不可配置(无法删除),也不可写(无法覆盖)。

有关详细信息,请参阅doc on MDN