显示模块模式添加子模块和访问私有函数

时间:2013-07-03 13:06:54

标签: javascript revealing-module-pattern

我想使用显示模块模式设置一些代码。 我想设置子模块,以便能够访问主模块的私有功能,但我仍然坚持如何做到这一点。

以下是我一直在玩的一些示例代码:

var Module = (function() {

    function B(){
        console.log("B");

    };

    return {
        //B: B
    };

})();

var Module = Module || {};

Module.Utils = (function() {

    function C() {

        B();
    };

    return {
        C: C
    }

}).apply(Module);

Module.Utils.C();

如何制作它以便我可以从Utils模块调用私有函数?

修改

Jsut澄清我希望能够创建一个添加到主模块的子模块,所以如果它有助于子模块也可以是模块。我正在读这个:http://www.sitepoint.com/modular-design-patterns-in-javascript/使用apply()添加第二个模块,但必须使用扩展和私有化函数将模块添加到主模块。如果可能的话,我想远离那个?

另一个编辑 简而言之,我希望将一个主模块和第二个模块放在一个仅用于一个部分的新文件中。我需要第二个模块仍然能够引用主模块私有函数。这可能吗?

这是我提到的代码:

//protected utility functions
    utils =
    {
        //add properties to an object
        extend : function(root, props)
        {
            for(var key in props)
            {
                if(props.hasOwnProperty(key))
                {
                    root[key] = props[key];
                }
            }
            return root;
        },

        //copy an object property then delete the original 
        privatise : function(root, prop)
        {
            var data = root[prop];
            try         { delete root[prop]; } 
            catch(ex)   { root[prop] = null; }
            return data;
        }
    };

1 个答案:

答案 0 :(得分:4)

除非您在与父模块相同的词法范围内定义子模块,并对“父”私有函数进行某种闭包,否则您不能。您将这些功能设为私有,因此您需要能够看到它们来调用它们。在与父模块不同的位置定义子模块时,您无法看到它们。获得所需结构的唯一方法是:

var Module = (function () {
    function B() {
        console.log("B");
    };

    var Utils = (function () {
        function C() {
            B();
        };

        return {
            C: C
        }
    })()

    return {
        Utils: Utils
    };
})();