我正在开发一个项目,在该项目中我创建了一个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;
}
答案 0 :(得分:0)
如果您支持不支持Object.defineProperty
的旧浏览器,那么我担心这是不可能的。
if (!Function.prototype.bind) {
Object.defineProperty(Function.prototype, 'bind', {
value: function() {
// function body here
}
});
}
使用Object.defineProperty
,默认情况下,属性/方法不可枚举(不会在枚举中显示),不可配置(无法删除),也不可写(无法覆盖)。
有关详细信息,请参阅doc on MDN。