-1

JavaScript クラスを作成しました。キーワードを使用してインスタンスを作成するとnew、すべてのインスタンスが同じ配列データを共有する理由がわかりません。

なぜこれが起こるのか誰か説明できますか?この例のCards配列は、作成したすべてのインスタンスによって参照されます。

(function (scope) {
    //Player class: player information, graphics object
    //Contructor: init properties
    function Player(opts) {
        //INITIALIZE PROPERTIES
        this.initialize(opts);
    }

    Player.prototype = {
        AccountID: '',
        Position: -1,
        UserName: '',
        Level: 0,
        Avatar: 'av9',
        Gold: 0,
        Cards: [],
        pos: { x: 0, y: 0 },
        graphicsObj: {},
        assets: {},
        Status: 0,

        initialize: function (opts) {
            //copy all properties to new instance       
            this.copyProp(opts);

            this.setCards();
            this.createGraphicObject();
        },

        //copy properties to instance
        copyProp: function (opts) {
            for (var prop in opts) {
                this[prop] = opts[prop];
            }
        },

        ... 
        ...

        setCards: function () {
            //create new Cards data with default position
            this.Cards[0] = new scope.Card({ image: this.assets['cards'] });
            this.Cards[1] = new scope.Card({ image: this.assets['cards'] });
            this.Cards[2] = new scope.Card({ image: this.assets['cards'] });
        }
    };

    scope.Player = Player;
}(window));
4

1 に答える 1

1

Javascript 関数では、配列はコピーされません。配列を参照する場合、常に同じ配列を参照します。

同じ配列への参照を渡したくない場合は、値を新しい配列にコピーする必要があります。配列に文字列のみが含まれている場合、これは簡単です。配列に他の配列またはオブジェクトが含まれている場合も、複雑になる可能性があります。

新しいオブジェクトに渡す前に、「カード」配列のコピーを作成します。

this.assets['cards'].slice(0); //Makes a copy of your array
于 2013-07-18T19:13:10.140 に答える