我想知道是否有可能以跨浏览器兼容的方式模仿ArrayBufferView
对ArrayBuffer
的约束边界行为(简称IE8)。
考虑这样的Javascript数组结构:
var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
我想获得b
子集的数组视图a
。例如当b
的索引发生变异时,a
中的索引也是如此。
用法示例:
var b = ViewOf(a, 3, 6); // Make a view of a, from index 3 to 6
console.log(b); // [3, 4, 5, 6]
b[0] = 42;
console.log(a); // [0, 1, 2, 42, 4, 5, 6, 7, 8, 9]
答案 0 :(得分:1)
我不知道IE8,因为它的Object.defineProperty是janky,但这似乎做你要求的,即使你问的不是最好的想法,其他评论指出的原因:
var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
function ViewOf(orig, from, to){
var sub=orig.slice(from, to);
for(var i=0, mx=sub.length;i<mx;i++){(function(i){ var it=sub[i];
Object.defineProperty(sub, i, { get: function(){ return it;}, set: function(v){ return it=orig[i+from]=v; } });
}(i));}
return sub;
}
var b = ViewOf(a, 3, 6); // Make a view of a, from index 3 to 6
console.log(b); // [3, 4, 5, 6]
b[0] = 42;
console.log(a); //shows: [0, 1, 2, 42, 4, 5, 6, 7, 8, 9]
答案 1 :(得分:0)
查看https://github.com/inexorabletash/polyfill。
此polyfill lib具有typedarray.js,其中包含ArrayBuffer和ArrayBufferView的polyfill。
我不知道这个lib。只是一个快速的googleing ..
答案 2 :(得分:0)
默认情况下这是不可能的。你可以使用自定义功能模仿它。
var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
ViewOf = function(a, startIdxx, endIdxx){
return {
startIdx: startIdxx,
endIdx: endIdxx,
set: function(index, value){
a[index+this.startIdx] = value;
},
get: function(index){
return a[index+this.startIdx];
}
}
}
现在您可以使用上面的功能
b = ViewOf(a, 3, 6);
b.set(0, 42);
console.log(a);