2

我正在尝试创建一个列在数组中的对象列表。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++;
}
4

2 回答 2

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/

这是一篇关于javascript 中的 this 关键字的文章。这是有关如何正确使用构造函数模式的另一个参考

之前发生的事情是您的第二次调用设置this.x为 3 但是this提到window,这是因为 javascript 中的函数将 this 分配给它们的调用者,除非它们是构造函数。在您的情况下window.x,您两次发出警报(您设置为 3)导致3 3

于 2013-02-06T23:42:55.397 回答
0

您忘记了关键字“new”,请参见下面的示例:

var one = new newConstant(1, 2);
var two = new newConstant(3, 4);
于 2013-02-06T23:45:26.363 回答