在类JavaScript中调用嵌套函数

时间:2014-12-20 18:09:17

标签: javascript jquery function class

我有一个名为“Game”的类,在其中,有一个名为“inventory”的属性,它调用“Inventory(id)”函数,其中创建所有库存函数并将其存放以清除杂乱。

我已经创建了一个新对象

var Game = new Game(body, mainElement, inventoryItems, statusElement);

(它应该是自我解释,正文正在选择正文标记,主要元素是我的主要区域,状态是状态元素,当然inventoryItems是< ul>我用来将我的项目追加到。) - 您可以查看codepen以便更好地理解。

您需要帮助我的主要代码

function Game(body, mainElement, inventoryItems, statusElement) {
  this.body = body;
  this.main = mainElement;
  this.inventory = Inventory(inventoryItems);
  this.status = statusElement;
}

function Inventory(y) {
  this.element = y;
  this.create = function(itemName, equippable, sellable) {
    this.element.append(function(){
      var item = '';

      if (itemName.length > 0) {
        item += "<li>" + itemName;

        if (sellable) {
          item += "<label>Sell<input type='checkbox' name='sell' onclick='javacript: confirmSell(this);' /></label>";
        }

        if (equippable) {
          item += "<label>Equip<input type='checkbox' name='equip' onclick='javacript: equip(this);' /></label>";
        }
      } 
      return item;
    }, this.element);

  }
}

var Game = new Game(body, mainElement, inventoryItems, statusElement);
Game.inventory(create("Bronze Knife", true, true));
Game.inventory(create("Ramen Noodles", false, true));
Game.inventory(create("Boots w/da Fur", true, true));

现在,当我尝试调用库存时,我得到了有趣的错误(create(string,bool,bool));

它创建了第一个项目,所以至少我知道“某些东西”正在“某种程度上”正确,或者我可能完全错误,并且应该只关闭我的计算机。

在Chrome中我告诉铜刀库存。创建告诉我undefined不是函数。

非常感谢任何帮助

编辑:link

3 个答案:

答案 0 :(得分:3)

Game.inventory是对象(对Inventory对象的引用(在new之前添加Inventory)),其中包含方法create,因此您可以像调用此方法一样此

  .....
  this.inventory = new Inventory(inventoryItems);
  .....

  var Game = new Game(body, mainElement, inventoryItems, statusElement);

  Game.inventory.create("Bronze Knife", true, true);
  Game.inventory.create("Ramen Noodles", false, true);
  Game.inventory.create("Boots w/da Fur", true, true);

演示:http://codepen.io/tarasyuk/pen/yyJGJK

答案 1 :(得分:1)

Game是一个函数,您正在定义一个名为Game的变量。

尝试将var Game = new Game(...);重命名为var game = new Game(...);

答案 2 :(得分:0)

创建广告资源时使用new。使用点表示法来访问库存的方法,因为它们是库存对象的属性。

// Relevant changes shown:

function Game(body, mainElement, inventoryItems, statusElement) {
  this.inventory = new Inventory(inventoryItems);
}

Game.inventory.create("Bronze Knife", true, true);

将来,您可能希望尝试通过像JSLint这样的linter来运行代码。只需关闭凌乱的白色空间&#34;选项或将/*jslint white: true */添加到文件的顶部,它应该为您提供有关如何自行解决此问题的有用反馈。

我通过JSLint运行你的代码,我注意到的第一件事是&#34;&#39;库存&#39;在定义之前使用过。&#34;所以我将库存移到游戏之上。我再次运行JSLint并报告&#34; Missing&#39; new&#39;。&#34;最后,我仔细查看了报告,发现&#34;&#39;创建&#39;在定义之前使用过。&#34;。这两点数据可能暗示了你正确的方向。