嵌套JavaScript对象

时间:2012-08-04 17:14:27

标签: javascript

我正在编写一个简单的JavaScript应用程序。代码包括创建一个对象deck,它可以有许多嵌套的card对象。

基本上,我希望能够访问甲板实例中的每张卡片,如下所示:

deck1.card2.method();

我使用以下函数创建了我的套牌原型:

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

function card(){
//card properties methods
}

我一直在使用JavaScript阵列的cardStackpush方法将每张卡添加到卡座并将其存储在pop数组中。

然而,这不允许我按照我的意愿访问我的卡片:

deck1.card2.method();

有人能以正确的方式指出我吗?在JavaScript中可以吗?提前谢谢: - )

3 个答案:

答案 0 :(得分:2)

您需要使用this

将对象和函数定义为父对象的属性
function Deck() {
  this.cardStack = [];
  this.card = function() {
    console.log('Hullo');
  }
}

现在调用该方法有效:

var deck = new Deck();
deck.card();   // Prints 'Hullo'

答案 1 :(得分:1)

要访问单卡对象,您需要将cardStack设为公共财产。在构造函数中,this keyword是对当前Deck对象的引用,因此您可以使用:

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

然后,通过var deck = new Deck(…)访问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"

答案 2 :(得分: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;

它可以作为你甲板上物品的财产。