【发布时间】: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)所指的对象没有这样的属性。privateMethod1和privateMethod2是变量。你如何访问变量?通过引用他们的名字。例如。var foo = 42; alert(foo);(没有this.foo)。 -
这个问题可以用更少的代码行来问,请参阅How to create a Minimal, Complete, and Verifiable example。
标签: javascript javascript-namespaces