Javascript 有时,array.length仅在.push()之后起作用(为什么?)

Javascript 有时,array.length仅在.push()之后起作用(为什么?),javascript,arrays,Javascript,Arrays,顶点是包含顶点对象的集合。顶点对象应作为数组访问(顶点[0]是顶点)。上面的代码工作得很好 function vertexes() {}; vertexes.prototype = []; vertexes.prototype.add = function (x, y, z) { this.push(new vertex(x, y, z)); return this[this.length-1]; } 但是,上面的代码没有。声明此[this.length]时,它始终声明此[0

顶点是包含顶点对象的集合。顶点对象应作为数组访问(顶点[0]是顶点)。上面的代码工作得很好

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

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

但是,上面的代码没有。声明此[this.length]时,它始终声明此[0],并返回未定义的。如果Vertex.prototype是数组,为什么array.length仅在i.push()元素时才起作用?

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

如果您尝试使用原型扩展数组,那么基本上将有一个普通对象,该对象具有数组的方法和默认属性值。使用
[]
为其赋值只会导致向其添加属性,而不会影响其长度

请注意,通过一些欺骗,可以扩展数组,从而使用括号为其赋值以更新长度。它基本上包括实例化实际的数组,并将您自己的方法附加到每个新实例

请看这里:


附加阅读:

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

如果您尝试使用原型扩展数组,那么基本上将有一个普通对象,该对象具有数组的方法和默认属性值。使用
[]
为其赋值只会导致向其添加属性,而不会影响其长度

请注意,通过一些欺骗,可以扩展数组,从而使用括号为其赋值以更新长度。它基本上包括实例化实际的数组,并将您自己的方法附加到每个新实例

请看这里:


附加阅读:

Hmm,所以它定义了长度0,因为这是[]的长度???push如何添加和更新长度??我不知道,我只是用推,因为它不需要长度!!我想我是lucky@RFiischer对你的第一个问题回答是
myObj.push(某物)
将在对象上执行数组
push
操作,这(我猜想)包括将
myObj[length]
设置为
something
,然后将
myObj.length
增加1。即使在普通对象上调用它,它也会这样做:
varo={};数组.原型.推送.调用(o,10);控制台日志(o)嗯,所以它定义了长度0,因为这是[]的长度???push如何添加和更新长度??我不知道,我只是用推,因为它不需要长度!!我想我是lucky@RFiischer对你的第一个问题回答是
myObj.push(某物)
将在对象上执行数组
push
操作,这(我猜想)包括将
myObj[length]
设置为
something
,然后将
myObj.length
增加1。即使在普通对象上调用它,它也会这样做:
varo={};数组.原型.推送.调用(o,10);控制台日志(o)
function vertexes() {};
vertexes.prototype = [];

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