2012-08-04 172 views
0

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

基本上,我希望能够访问每个卡在甲板情况是这样的:

deck1.card2.method(); 

我用下面的函数创建我的甲板原型:

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

function card(){ 
//card properties methods 
} 

我我们已经将每张卡片添加到卡片组中,并使用pushpop JavaScript数组方法将它们存储在cardStack数组中。

然而,这并不让我来访问我的卡片,因为我希望做的事:

deck1.card2.method(); 

任何人都可以点我在实现这一目标的正确方法吗?在JavaScript中可能吗?谢谢你在前进:-)

回答

1

要访问单个卡片对象时,您需要将您的cardStack设置为公共属性。构造函数内部,this keyword是当前Deck对象的引用,所以你可以使用:

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

然后,通过deck.cards[2]访问var deck = new Deck(…)单卡,并调用它的方法。

或者您对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" 
+0

是否有可能不允许用户创建卡片而不先创建卡座?我的意思是,在这里,我们可以通过新卡(i)创建一个卡实例。怎样才能做到这一点?感谢你的帮助! :-) – Hirvesh 2012-08-04 17:26:40

+0

您可以使用[closure](http://stackoverflow.com/q/111102/1048572)来隐藏公开的'Card'构造函数。但你为什么要这么做? – Bergi 2012-08-04 17:30:29

+0

这是因为每张牌都必须属于一个牌组:p不需要太多问,你可以编辑你的示例来告诉我如何创建关卡并在牌组内创建卡的新实例?请? – Hirvesh 2012-08-04 17:32:59

2

您需要使用this定义对象和函数作为父对象的属性:

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

现在调用该方法的工作原理:

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

我可以在卡组内有很多卡对象的实例吗? :$ – Hirvesh 2012-08-04 17:19:38

+0

'this.cardStack'是一个数组对象,所以你可以插入尽可能多的卡片,只要你愿意。 – Blender 2012-08-04 17:20:18

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); 
} 

也许你正在创建一个卡对象。如果是这样,你可以使用:

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

,这将是可以作为你的甲板对象上的属性。