Javascript:数组中的所有对象具有相同的属性

时间:2013-02-06 23:41:03

标签: javascript arrays object

我正在尝试创建一个列在数组中的对象列表。 newConstant是一个创建对象的函数,它们将它们推送到数组。但是,当while循环遍历数组并抛出包含每个数组的一个属性的警报时,它会为数组中的每个对象吐出最后一个对象的值。在这种情况下,它每次都警告“3”,但它应该警告“1”,然后是“3”,因为它们是数组“a”中两个对象的属性x的值。代码如下。我该如何解决这个问题?

var i = 0;
var a = [];
var newConstant = function (x, y) {
    this.x = x;
    this.y = y;
    a.push(this);
};
var one = newConstant(1, 2);
var two = newConstant(3, 4);

while (i < a.length) {
    alert(a[i].x);
    i++;
}

2 个答案:

答案 0 :(得分:1)

您已将newConstructor编写为构造函数,但您将其用作普通函数,请尝试添加new关键字。

var i = 0;
var a = [];
var newConstant = function (x, y) {
    this.x = x;
    this.y = y;
    a.push(this);
};
var one = new newConstant(1, 2); //notice the new keyword indicating a constructor
var two = new newConstant(3, 4);

while (i < a.length) {
    alert(a[i].x);
    i++;
}

这里有效:http://jsfiddle.net/V3zwW/

以下是关于the this keyword in javascript的文章。这是另一个reference on how to correctly use the Constructor pattern

之前发生的事情是你的第二个电话集this.x为3但是this引用了window,这是因为javascript中的函数会将其分配给调用者,除非它们是构造函数。在您的情况下,您提醒了window.x(您设置为3)两次,导致3 3

答案 1 :(得分:0)

您忘记了关键字“new”,请参阅以下示例:

var one = new newConstant(1, 2);
var two = new newConstant(3, 4);