Javascript模块模式-所有模块都可以相互访问吗?

Javascript模块模式-所有模块都可以相互访问吗?,javascript,design-patterns,Javascript,Design Patterns,我已经使用了大量的香草javascript和jquery。我现在正在尝试编写一个应用程序,它使用某种形式的闭包来私有化方法,这样所有的东西就不只是在公共名称空间中了 我转向模块模式,因为它似乎是我问题的解决方案,但是我不能完全理解它。当您使用此模式向主应用程序添加方法时,所有模块是否也可以使用其他模块中的所有方法?因为,看起来情况并非如此 var MODULE = (function () { var my = {}, privateVariable = 1;

我已经使用了大量的香草javascript和jquery。我现在正在尝试编写一个应用程序,它使用某种形式的闭包来私有化方法,这样所有的东西就不只是在公共名称空间中了

我转向模块模式,因为它似乎是我问题的解决方案,但是我不能完全理解它。当您使用此模式向主应用程序添加方法时,所有模块是否也可以使用其他模块中的所有方法?因为,看起来情况并非如此

var MODULE = (function () {
    var my = {},
        privateVariable = 1;

    function privateMethod() {
        // ...
    }

    my.moduleProperty = 1;
    my.moduleMethod = function () {
        console.log("Method 1!");
    };
    my.anotherMethod(); //This doesn't work. anotherMethod() not     defined
    return my;
}());

var MODULETWO = (function (my) {
    my.anotherMethod = function () {
        console.log("Method 2!");
    };
    my.moduleMethod();
    my.anotherMethod();
    return my;
}(MODULETWO));
出于某种原因,我希望注释后的方法能够工作。我们能做到吗?我设想有一个app.js和一个app的肉,还有其他单独的js文件,它们有实用功能来帮助那个app,但在很多情况下,我设想那些实用程序类需要访问主app的作用域。我似乎不明白

想法


与我交谈过的人向我指出了Browserify.js,但我不知道这是否解决了我通过闭包无法访问所有内容的要求。它看起来就像一个捆绑应用程序

您的问题是没有遵守面向对象的设计规则。这方面有各种各样的范例,还有更多的书籍、博客和视频,你可以在10辈子内消费。我个人推荐OOP的坚实原则


更具体地说,您的模块应该用作封装单元。一个模块应该有一个单一的逻辑职责,该职责应该通过其公共方法公开。如果您需要访问它的私有方法,那么您就有一个设计问题。

临时模块模式提供了一种创建隐私的方法,它将一个值封装在函数中,从而实现闭包

这样想:

如果在函数中声明变量,则只能在该函数中访问该变量,除非公开该变量

未曝光的,_foo只是坐在那里等待垃圾收集

var foo = function() {
    _foo = {name: 'joe', age: 42};
};
var myFoo = new foo();//this is undefined as we return nothing
暴露,姓名暴露但年龄不暴露,您无法直接访问\u-foo。在代码中,低于年龄是无用的,因为它无法到达

var foo = function() {
    _foo = {name: 'joe', age: 42};
    var api = {
        getName: function() {
            return _foo.name;//api can return this because _foo is still in scope
        }

};
var myFoo = new foo();//this is an object with one method, getName (it is the api returned from foo).
如果您创建另一个构造函数bar,它将无法与_-foo交互,因为它被困在myFoo内部。bar的api只能访问其中定义的变量,在本例中为\u bar

var bar = function() {
    _bar = {name: 'mike', age: 4};
    var api = {
        getName: function() {
            return _foo.name;
        },
        getAge: function() {
            return _bar.age
        hasBirthday: function() {
            _bar.age++;
            return _bar.age;//bumps the age and returns the new age.
        }

};
注意,该栏充分利用了私有数据,添加setter可能是一个好主意

这种模式提供了隐私,你如何构建你的应用程序完全取决于你自己


查看本书,了解基本Javascript模式的全面示例:

在调用
modulewo
时,您是否打算传递
MODULE
,这是打字错误吗?即使这样,它也不会工作,因为
MODULE
不知道将方法添加到对象的
modulewo