0

簡単なJavaScriptアプリケーションを書いています。コードは、deck多くのネストされたcardオブジェクトを持つことができるオブジェクトを作成することで構成されています。

基本的に、私は次のようなデッキインスタンスの各カードにアクセスできるようにしたかったのです。

deck1.card2.method();

次の関数を使用して、デッキのプロトタイプを作成しました。

function Deck(){
var cardStack = []
//deck properties & methods
}

function card(){
//card properties methods
}

JavaScript配列のメソッドを使用して、各カードをデッキに追加し、cardStack配列に格納してきました。pushpop

ただし、これでは、希望どおりにカードにアクセスできません。

deck1.card2.method();

誰かがこれを達成するための正しい方法で私を指すことができますか?JavaScriptで可能ですか?前もって感謝します :-)

4

3 に答える 3

2

以下を使用して、オブジェクトと関数を親オブジェクトのプロパティとして定義する必要がありますthis

function Deck() {
  this.cardStack = [];
  this.card = function() {
    console.log('Hullo');
  }
}

メソッドの呼び出しが機能するようになりました。

var deck = new Deck();
deck.card();   // Prints 'Hullo'
于 2012-08-04T17:16:17.300 に答える
1

カードまたはデッキを配列にプッシュするメソッドで、実行時にオブジェクトにプロパティを追加するだけで、このようなメソッドを動的に実装できます。

例えば:

var DeckStack = {
    initialize: function() {
        this.deckStack = [];
    },

    addDeck: function (name) {
        this.deckStack.push(name);
        this['deck' + this.deckStack.length] = name;    // <-- We add a method or property to the object dynamically
    }
};

DeckStack.initialize();
DeckStack.addDeck('test');
console.log(DeckStack.deck1);  // Writes 'test' to console

// This will show our new method/property as part of the object
for (var meth in DeckStack) {
    console.log(meth);
}

Card オブジェクトを作成している可能性があります。その場合は、次を使用します。

var card = new Card(name); // For example
this['deck' + this.deckStack.length] = card;

デッキ オブジェクトのプロパティとして使用できます。

于 2012-08-04T17:44:00.853 に答える
1

cardStackシングル カード オブジェクトにアクセスするには、パブリック プロパティにする必要があります。コンストラクター内では、thisキーワードは現在のDeckオブジェクトへの参照であるため、次を使用できます。

function Deck(){
   this.cards = [];
   // deck properties & methods
}

var deck = new Deck(…)次に、 viaの 1 つのカードにアクセスし、deck.cards[2]そのメソッドを呼び出します。

cardStackまたは、配列へのアクセサ関数を使用します。拡張例:

var Deck = (function() {
    function Deck() {
        var cardStack = [];
        this.getCard = function(i) { return cardStack[i]; };

        for (var i=0; i<5; i++)
            cardStack.push(new Card(i));
    }
    function Card(i) {
        this.method = function() {
            alert("Hi, I'm card №"+i);
        };
    }
    return Deck;
})();

var deck = new Deck();
deck.getCard(2).method(); // alerts "Hi, I'm card №2"
于 2012-08-04T17:19:26.417 に答える