子类阵列的长度

时间:2015-06-02 13:48:58

标签: javascript arrays

在以下片段中,子类化数组的行为与原始数组不同。为什么呢?

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属性不会通过索引访问元素而发生变化。

1 个答案:

答案 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"属性调用对象:

  
      
  1. 使用参数true n parentTable ... ::= { parentNode 1 } -- using index x childTable ... ::= { parentNode 2 } -- using index x and y 调用 O 的[[Put]]内部方法。
  2.   

有关可行的示例,请使用ES6技术,请参阅Array subclassing with setPrototypeOf