0

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

基本上,我希望能够像这样访问卡片组实例中的每张卡片:

deck1.card2.method();

我使用以下函数来创建我的甲板原型:

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

function card(){
//card properties methods
}

我一直在将每张卡片添加到卡片组并将它们存储在cardStack数组中,使用JavaScript 数组的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

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

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

然后,访问var deck = new Deck(…)via的单张卡片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 回答
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 回答