2

配列にリストされているオブジェクトのリストを作成しようとしています。newConstant は、オブジェクトを作成し、それらを配列にプッシュする関数です。ただし、while ループが配列全体で実行され、各配列のプロパティの 1 つを含むアラートがスローされると、配列内の各オブジェクトの最後のオブジェクトの値が吐き出されます。この状況では、毎回「3」を警告しますが、「1」、次に「3」を警告する必要があります。これは、配列「a」内の 2 つのオブジェクトのプロパティ 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 キーワードに関する記事です。コンストラクター パターンを正しく使用する方法に関する別のリファレンスを次に示します。

前に起こったのは、2 番目の呼び出しthis.xが 3 に設定されていることですが、this参照するとwindow、これは、コンストラクターでない限り、JavaScript の関数が呼び出し元に this を割り当てるためです。あなたの場合、window.x(3に設定して)2回警告した結果、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 に答える