1

こんにちは、私は次のコードを持っています

POINT = function () {
    that = {};
    that.x = 0; that.y = 0;

    that.setPoint = function (x, y) {
        that.x = x;
        that.y = y;
    };

    that.toString = function () {
        return that.x + ',' + that.y + ' ';
    };    

    return that;
};

PEN = function () {
    var that = {};
    var points = [];
    var buffer_size = 5, head = -1, length = 0;

    // Init buffer
    for (var i = 0; i < buffer_size; i++) {
        points.push(POINT());
    }

    that.addPoint = function (x, y) {
        head = (head + 1) % buffer_size;
        points[head].setPoint(x, y);
        if (length < buffer_size) {length++;}
    };

    that.toString = function (path) {
        var d = '';
        for (var i = 0; i < length; i++) {
            var index = (head - i) < 0 ? buffer_size + (head - i) : (head - i);
            d += points[index].toString();
        }
        return d;
    };

    return that;
};

// Initialization
var i = 0, pen = PEN();

for (var i = 0; i < 10; i++) {
    pen.addPoint(i + 1, i + 1);
}

alert(pen.toString()); // RESULT 10,10 10,10 10,10 10,10 10,10

配列はpoints正しいオブジェクトで満たされていますpenが、関数は常に配列内の最後のオブジェクトをsetPoint指しています。penpoints

x注:直接アクセスできるようにして調整したいので、varを使用して「ローカル」変数としてy宣言xしていません。y

例のフィドルはここにあります:http://jsfiddle.net/DNVjy/2/

4

3 に答える 3

3

変数を変数に配置する必要があります:-)

現在、window オブジェクトに関数とローカルの 'that' を定義しています。コードが現在あるため、「それ」は必要ありません。

これを試して:

function POINT() {

    this.x = 0; this.y = 0;

    this.setPoint = function (x, y) {
        this.x = x;
        this.y = y;
    };

    this.toString = function () {
        return this.x + ',' + this.y + ' ';
    };    

    return this;
};

function PEN() {
    var points = [];
    var buffer_size = 5, head = -1, length = 0;

    // Init buffer
    for (var i = 0; i < buffer_size; i++) {
        points.push(new POINT());
    }

    this.addPoint = function (x, y) {
        head = (head + 1) % buffer_size;
        points[head].setPoint(x, y);
        if (length < buffer_size) {length++;}
    };

    this.toString = function (path) {
        var d = '';
        for (var i = 0; i < length; i++) {
            var index = (head - i) < 0 ? buffer_size + (head - i) : (head - i);
            d += points[index].toString();
        }
        return d;
    };

    return this;
};

次のようにペンを宣言します。

var pen = new PEN();

new POINT()( PEN「クラス」内のキーワードにも注意してください)。

于 2013-05-28T07:05:00.090 に答える
2

ローカル変数 (その前に配置) に変更thatすると、出力が次のように変更されます。POINTvar
10,10 9,9 8,8 7,7 6,6

うまくいけば、これはあなたが期待していたものです。更新されたフィドル: http://jsfiddle.net/DNVjy/3/

于 2013-05-28T07:04:27.093 に答える
1

あなたのthatインPOINTはグローバルであってはなりません!グローバル変数を作成するたびに同じグローバル変数を上書きしているため、それらはすべて同じ値のペアを参照しています。

FWIW、意図した方法で JS オブジェクトを使用しないのはなぜですか?

function POINT() {
    if (this instanceof POINT) {
        this.x = 0; this.y = 0;
    } else {
        return new POINT();   // allow creation without "new"
    }
};

POINT.prototype.setPoint = function (x, y) {
    this.x = x;
    this.y = y;
};

POINT.prototype.toString = function () {
     return this.x + ',' + this.y + ' ';
};    

使用しているモジュール パターンは、多くの目的で最適ではありません。

  • 各インスタンスは、メソッドを共有するのではなく、独自のメソッドのコピーを取得します
  • 返されたオブジェクトには特定の「タイプ」がありません
于 2013-05-28T07:01:53.153 に答える