3

这是我发现自己多年来使用和调整的一种 js 模式。

问题是,经过一些实验,我陷入其中,我很想知道这种模式是否有名字。我浏览了很多设计模式,但没有发现任何类似的东西(或者很简单,特别是对于模块化类型模式)。

var FOO = (function ($) {
    var privateFuncA = function() {
        ...
    },        
    privateFuncB = function() {
        ...
    },
    self = {
        init: function() {
            privateFuncA(); // Call a private func
            self.publicFunc(); // Call a public func
        },
        publicFunc: function() {
            ...
        }
    };
    return self;
}(jQuery));

$(function () {
    // Initialise FOO
    FOO.init();
});

想法是将所有内容都保留在名称空间中,并允许伪公共/私有功能。

如果我需要模块化,我将扩展基本 FOO 对象:

// Extend FOO object
FOO.Bar = (function ($) {
    var privateFunc = function() {
        ...
    },
    self = {
        publicFunc: function() {
            ...
        }
    };
    return self;
}(jQuery));

如果您想从外部调用扩展对象中的 publicFunc,您可以:

FOO.Bar.publicFunc()

有谁知道这种类型的模式是否有名称,或者这种设计是否存在任何已知问题?

4

1 回答 1

3

当然。它只是 Christian Hielmann 的“Revealing Module”模式的扩展,它本身就是 Douglas Crockford 的 Module 模式的扩展。

在我的很多关于 SO 的示例中,我将使用非常相似的东西,除了替换selfpublic_interface, 来尝试更明显地了解什么是publicprivateprivate-static

var built_module = (function () {

    var private_data = "",
        private_method = function () { /* ... */ },

        public_interface = {
            public_method : function () { /* ... */ },
            public_data
        };

    return public_interface;

}());

并作为构造函数:

var built_constructor = (function (env_params) {

    var static_data = "",
        static_method = function () { /* ... */ },

        public_constructor = function (params) {
            var private_data = "",
                private_method = function (params) { /* ... */ },

                public_interface = {
                    public_method : function () { /* ... */ },
                    public_data
                };

            return public_interface;
        };

    return public_constructor;
}(envArgs));


var myInstance = built_constructor(myArgs);

“静态”数据/属性位于外部闭包中,因此内部闭包中的所有变量/函数都可以访问它们,而“静态”方法无法访问任何实例方法/数据,无需传递函数中的参数。

您可以从这里以任何方式扩展它——删除返回值,而是将 指定public_interface为对象的属性,或者window默认情况下(用于命名空间)。

于 2012-12-02T17:39:54.380 回答