繁体   English   中英

为什么不能在模块中调用构造函数方法?

[英]Why can't I call my constructor method within my module?

我有一个名为Mole的模块:

var Mole = (function(){

  function mole(id){
    this.id = id;
  }

  var randomMole = function(){
    var moleIndex = Math.ceil(Math.random() * 8);
    var mole = moles[moleIndex];
    return mole.id;
  }

  var score = 0;

  var moles = [];

  var generateMoles = function(){
    for(var i = 1; i <= 8; i++){
      var mole = new mole(i);
      moles.push(mole);
    }
  }

  return {

    init: function(){
      //var mole = mole;
      generateMoles();
    },

    randomMole: randomMole,

    score: function(){
      return score;
    },

    incrementScore: function(){
      score += 1;
    }
  }


})()

文档准备好后,我正在调用Mole.init()。

这将调用generateMoles方法,该方法在模块顶部使用mole构造函数。 除了在我的generateMoles函数中调用mole构造函数时,我都会收到此错误:

model.js:19 Uncaught TypeError: mole is not a constructor

为什么不是痣的构造函数? 我将其定义为模块顶部的一个。

我认为可能是因为在init()函数中调用mole方法时,该方法不在generateMoles范围内,因为init函数将为generateMoles创建一个新的闭包,其中不包含mole构造函数。 因此,我尝试了在init函数中定义mole的工作,因此将其包含在generateMoles的闭包中。但是无论是否执行此操作,我仍然会遇到相同的错误。

所以现在我不知道为什么我不能调用新的mole()了。任何帮助将不胜感激。 谢谢。

var声明被“提升到顶部”(即到函数内仍位于最外部的范围, 请参见“ var hoisting” )。 因此,您的generateMoles等效于:

var generateMoles = function(){
  var mole;
  for(var i = 1; i <= 8; i++){
    mole = new mole(i);
    moles.push(mole);
  }
}

这当然会破坏new mole(i)表达式,因为mole不再是指mole函数,而是指该函数中的mole变量。

对此的直接解决方案是简单地对本地变量使用其他名称,例如m

var generateMoles = function(){
  for(var i = 1; i <= 8; i++){
    var m = new mole(i);
    moles.push(m);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM