在以下片段中,子类化数组的行为与原始数组不同。为什么呢?
function Arr() {}
Arr.prototype = new Array();
var iArr = new Arr();
iArr[0] = 9;
iArr[5] = 10;
console.log(iArr.length);
console.log(iArr[0]);
console.log(iArr[5]);
iArr.push(87);
console.log(iArr.length);
console.log(iArr[0]);
console.log(iArr[5]);
结果
0
9
10
1
87
10
,而
var iArr = new Array();
iArr[0] = 9;
iArr[5] = 10;
console.log(iArr.length);
console.log(iArr[0]);
console.log(iArr[5]);
iArr.push(87);
console.log(iArr.length);
console.log(iArr[0]);
console.log(iArr[5]);
给出
6
9
10
7
9
10
我对第一个片段的期望也是如此。
我无法理解为什么第一个代码段中的length属性不会通过索引访问元素而发生变化。
答案 0 :(得分:1)
length
行为仅适用于Array
构造函数通过new Array
创建的对象。也就是说,length
自动行为仅适用于真正的Array
实例。在这里,您拥有的唯一Array
实例是Arr.prototype
,这是iArr
的原型父级。 iArr
并非由new Array
创建length
,因此它无法获得神奇的iArr
行为。
在Array
上设置值不会以任何方式操纵原型父级,因此您的length
实例未经修改,这意味着iArr.push
未经修改。
当您致电Array
时,您也未修改父push
个实例,但the ES5 spec for push
要求length
设置"length"
属性调用对象:
- 使用参数
醇>true
, n 和parentTable ... ::= { parentNode 1 } -- using index x childTable ... ::= { parentNode 2 } -- using index x and y
调用 O 的[[Put]]内部方法。
有关可行的示例,请使用ES6技术,请参阅Array subclassing with setPrototypeOf