-1

スプライトの位置を別のオブジェクト内にカプセル化したかったのです。そのため、とを使用する代わりに、tile.xとを介してtile.yアクセスします。tile.position.xtile.position.y

しかしtile.position、initメソッド内での値を設定すると、タイルオブジェクトのすべてのインスタンスが同じ値に変更されます。何故ですか?

私が設定したときと同じようにtile.x、すべてが期待どおりに機能します。つまり、各オブジェクトが正しい値を取得します。

これが私が複数のインスタンスを作成する方法です:

forループで、上記のオブジェクトの複数のインスタンスを作成しています。

for (var y = 0; y < 10; ++y) {
  for (var x = 0; x < 10; ++x) {
    var tile = Object.create(tileProperty);
    tile.init(x, y);
    ...
  }
}

そして、これは複製されたオブジェクトです:

var tileProperty = {
    // this works
    x: null, 
    y: null,
    // this will get changed for ALL instances
    position: { 
        x: null,
        y: null
    },
    init: function(x, y) {
        this.name = x.toString() + y.toString();
        this.x = x;
        this.y = y;
        this.position.x = x;
        this.position.y = y;
        this.canvas = document.createElement('canvas');
        var that = this;
        $(this.canvas).bind('click', function() {
            console.log(that.position, that.x, that.y);
        });

        document.body.appendChild(this.canvas);
    }
}
4

2 に答える 2

1

すべてのオブジェクトで同じpositionオブジェクトへの参照があります。

あなたがすべきことは、標準のプロトタイプソリューションを使用することです:

function tileProperty() {
    this.position = { 
        x: null,
        y: null
    };
}
tileProperty.prototype.init = function(x, y) {
    this.name = x.toString() + y.toString();
    this.x = x;
    this.y = y;
    this.position.x = x;
    this.position.y = y;
    this.canvas = document.createElement('canvas');
    var that = this;
    $(this.canvas).bind('click', function() {
        console.log(that.position, that.x, that.y);
    });

    document.body.appendChild(this.canvas);
}

次に、を使用してインスタンスを構築します

var tp = new tileProperty();
于 2012-12-11T14:00:27.400 に答える
1

これを使って:

var tileProperty = {
    position: { // we will inherit from this
        x: null,
        y: null,
        init: function(x, y) {
            this.x = x;
            this.y = y;
        }
    },
    init: function(x, y) {
        this.name = x.toString() + y.toString();
        // create an own Position object for each instance
        this.position = Object.create(this.position);
        // and initialize it
        this.position.init(x, y); // you might inline this invocation of course
        …
    },
    …
}
于 2012-12-11T14:59:16.413 に答える