2014-10-01 53 views
1

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

的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"); 
    } 
    } 
})(); 

enter image description here

+3

删除'this.'部分。您尝试访问的功能不是您要返回的对象的一部分,因为它们不应该是公开的。它们是模块IIFE内的*局部变量*。 – 2014-10-01 01:15:35

+0

最近的重复? http://stackoverflow.com/questions/3127429/javascript-this-keyword – elclanrs 2014-10-01 01:16:32

+0

我试着用'''MODULE_A.'''替换'''this.''',并且仍然出现同样的错误 – tarabyte 2014-10-01 01:21:39

回答

3

的解决方案是两个中的一个:

当你声明的东西与var,它不能与访问this

之一:

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

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

编辑:如果你想方法为私有,你应该按照method2,你可以去this site了解更多的解释。

+0

第二个答案是正确的。 – Scimonster 2014-10-01 05:25:54