2016-02-10 139 views
0

我已经做了相当数量的香草javascript和jquery。我正在尝试编写一个应用程序,该应用程序使用某种形式的关闭来私有化方法,以便所有内容都不在公共名称空间中。Javascript模块模式 - 所有模块都可以访问eachother吗?

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

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与一个应用程序的肉,与其他具有实用功能来帮助该应用程序的单独js文件,但在很多情况下,我设想那些需要访问主应用程序范围的实用程序类。我似乎无法得到...

想法?

有人跟我说过Browserify.js,但我不知道这是否解决了我通过关闭无法访问所有东西的要求。它看起来就像一个捆绑应用程序。

+0

你打算通过'MODULE'调用'MODULETWO'的时候,它是一个错字?即使那样它也不会起作用,因为'MODULE'对方法被添加到对象的'MODULETWO'没有任何意义。 – BatScream

回答

0

你的问题是你不遵守面向对象的设计规则。这有很多范例,还有更多的书籍,博客和视频,然后你可以在10个有生之年消耗掉。我个人建议OOP的SOLID原则。

更具体地说,你的模块应该作为封装单元。一个模块应该有一个单独的逻辑责任,应该通过公开的方法来公开。如果您需要访问其私有方法,则会出现设计问题。

0

adhoc模块模式为您提供了一种通过在函数内部封闭值来创建隐私的方法,因此可以实现闭包。

认为它是这样的:

如果声明函数内部变量,它只能在该函数访问,除非将其公开。

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

var foo = function() { 
    _foo = {name: 'joe', age: 42}; 
}; 
var myFoo = new foo();//this is undefined as we return nothing 

曝光,名字被暴露,但年龄不,你不能直接访问_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只能访问里面定义的变量,在这种情况下是_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可能是一个好主意。

此模式提供隐私,您构建应用程序的架构完全取决于您。

看看这本书为fundemental的Javascript模式的全面例子:https://addyosmani.com/resources/essentialjsdesignpatterns/book/