Еще маленькая ошибка (сам только что у себя заметил):
var r = (new Array(5)).map(function(I, i) {
return i;
});
alert(r.length);
Выводит "0", при нативной реализации выводит "5".
Ну и проверки на (forEach, map, filter, every, some) и (reduce, reduceRight), возможно, достаточно делать по одной на всех:
if (!('forEach' in arrayProto)) {
arrayProto.forEach = function() {/* ..... */};
arrayProto.map = function() {/* ..... */};
arrayProto.filter = function() {/* ..... */};
arrayProto.every = function() {/* ..... */};
arrayProto.some = function() {/* ..... */};
}
if (!('reduce' in arrayProto)) {
arrayProto.reduce = function() {/* ..... */};
arrayProto.reduceRight = function() {/* ..... */};
}