【问题标题】:Unable to call 'private' method from javascript namespace?无法从 javascript 命名空间调用“私有”方法?
【发布时间】:2014-11-25 18:42:28
【问题描述】:

我试图了解如何通过 javascript 中的文件来分解功能。我试图将命名空间视为单例类。我不明白为什么在下面的代码中,MODULE_A.privateMethod1() 会抛出错误:Uncaught TypeError: undefined is not a function。当我打开记录的对象时,我也看不到那里的私有方法。

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Test Project</title>

    <script src="index.js"></script>
    <script src="moduleA.js"></script>
  </head>
    <body>
      <div>
        hi
      </div>
  </body>
</html>

index.js:

(function() {

  var initializeWindow = function() {
    console.log("initializeWindow");
    MODULE_A.publicMethod1();
  };

  window.addEventListener('load', initializeWindow);
})();

moduleA.js:

// "Singleton Class"
var MODULE_A = (function() {
  // ---------------------------------------------------------------------------
  // "Private" Class Constants
  // ---------------------------------------------------------------------------
  var A_CONSTANT_NUMBER = 1;

  // ---------------------------------------------------------------------------
  // "Private" Class Variables (Properties)
  // ---------------------------------------------------------------------------
  var myPrivateVar_ = 2;

  // ---------------------------------------------------------------------------
  // "Private" Methods
  // ---------------------------------------------------------------------------
  var privateMethod1 = function() {
    console.log("A.privateMethod1");
  };

  var privateMethod2 = function() {
    console.log("A.privateMethod2");
  };

  return {
    // ---------------------------------------------------------------------------
    // "Public" Class Variables (Properties)
    // ---------------------------------------------------------------------------
    aPublicVar1: 3,

    // ---------------------------------------------------------------------------
    // "Public" Methods
    // ---------------------------------------------------------------------------
    publicMethod1: function() {
      console.log("A.publicMethod1");
      this.publicMethod2();
      // ERROR HERE!!!
      this.privateMethod1();
      this.privateMethod2();
    },

    publicMethod2: function() {
      console.log("A.publicMethod2");
    }
  }
})();

【问题讨论】:

  • 删除this. 部分。您尝试访问的函数不是您要返回的对象的一部分,因为它们不应该是公共的。它们是模块 IIFE 中的局部变量
  • 我尝试将this. 替换为MODULE_A. 仍然是同样的错误
  • 这并不奇怪,因为this === MODULE_A。正如我所说,this(和MODULE_A)所指的对象没有这样的属性。 privateMethod1privateMethod2变量。你如何访问变量?通过引用他们的名字。例如。 var foo = 42; alert(foo);(没有this.foo)。
  • 这个问题可以用更少的代码行来问,请参阅How to create a Minimal, Complete, and Verifiable example

标签: javascript javascript-namespaces


【解决方案1】:

解决方案是两种之一:

当您使用var 声明某些内容时,无法使用this 访问它

要么:

this.privateMethod1 = function() {
console.log("A.privateMethod1");
};

 publicMethod1: function() {
  console.log("B.publicMethod1");
  this.publicMethod2();
  privateMethod1();
  privateMethod2();
},

edit:如果你想要私有方法,你应该按照method2,你可以去this site了解更多。

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2021-02-11
    相关资源
    最近更新 更多