有时array.length只能在.push()之后工作(为什么?)

时间:2015-03-06 18:47:50

标签: javascript arrays

function vertexes() {};
vertexes.prototype = [];

vertexes.prototype.add = function (x, y, z) {
    this.push(new vertex(x, y, z));
    return this[this.length-1];
}

Vertexes是一个包含顶点对象的集合。顶点对象应作为数组访问(顶点[0]是顶点)。上面的代码工作正常。

function vertexes() {};
vertexes.prototype = [];

vertexes.prototype.add = function (x, y, z) {
    this[this.length] = new vertex(x, y, z);
    return this[this.length-1];
}

但是,上面的代码并不是。声明这个[this.length]时,它总是声明这个[0],并返回undefined。如果vertexes.prototype是一个数组,为什么array.length仅在i .push()元素时才有效?

1 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为[]运算符对实际数组有特殊行为。您正在创建的对象不是数组。

如果尝试使用原型扩展数组,则基本上会有一个普通对象,其中包含Array的方法和默认属性值。使用[]为其分配值只会导致向其添加属性,并且不会影响其长度。

请注意,通过一些操作, 可以扩展数组,以便使用括号更新长度来为其分配值。它主要涉及实例化实际数组并将自己的方法附加到每个新实例。

在此处查看: http://www.bennadel.com/blog/2292-extending-javascript-arrays-while-keeping-native-bracket-notation-functionality.htm

补充阅读:http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/