在使用javascript模块模式时,如何从私有方法中调用公共方法?

时间:2010-12-21 23:56:27

标签: javascript module-pattern

我想从私有方法调用公共方法,但属性“this”指向窗口对象。

请注意我正在尝试应用模块模式。您可以在jsfiddle.net

找到有效的代码示例
// how can i access a public method from a private one?
// (in this example publicAlert from privateMethod)
// this refers to the window object.

$(function() {
var modulePattern = (function($)
{
    var privateMethod = function()
    {
        appendText("called privateMethod()");
        this.publicAlert();
    };

    var appendText = function(texToAppend)
    {
        var text = $('#output').text() + " | " + texToAppend;
        $('#output').text(text);
    };

    return {
        publicMethod : function()
        {
            appendText("called publicMethod()");
            privateMethod();
        },

        publicAlert : function()
        {
            alert("publicAlert");
        }
    };
});

mp = new modulePattern($);
mp.publicMethod();
});

2 个答案:

答案 0 :(得分:11)

如果您希望能够这样做,您需要像私有函数一样声明'public'函数,然后将其公开为public。像这样:

$(function() {
    var modulePattern = (function($) {
        var privateMethod = function() {
            appendText("called privateMethod()");
            publicAlert();
        };

        var appendText = function(text) {
            var text2 = $('#output').text() + " | " + text;
            $('#output').text(text2);
        };

        var publicAlert = function(){
            alert("publicAlert");            
        };

        return {
            publicMethod: function() {
                appendText("called publicMethod()");
                privateMethod();
            },

            publicAlert: publicAlert
        };
    });

    mp = new modulePattern($);
    mp.publicMethod();
});

[编辑] 我还鼓励你养成点击jsfiddle顶部的'jslint'按钮的习惯,你的代码缺少几个分号,你还重新声明了你的appendText函数中的'text'变量(它已经通过了)在)

此外,您使用模块模式的方式与我学习模式的方式略有不同。您是否有指向参考资料的链接?

这就是我所知道的模块模式:http://jsfiddle.net/sVxvz/ [/编辑]

另外,如果正确使用模块模式,可以使用模块名称来引用公共函数,如下所示:

var testModule = (function($) {
    var privateMethod = function() {
        appendText("called privateMethod()");
        testModule.publicAlert();
    };

    var appendText = function(text) {
        var text2 = $('#output').text() + " | " + text;
        $('#output').text(text2);
    };

    return {
        publicMethod: function() {
            appendText("called publicMethod()");
            privateMethod();
        },
        publicAlert: function() {
            alert("publicAlert");
        }
    };
}(jQuery));

$(function() {
    testModule.publicMethod();
});

但我不喜欢这样,因为公共方法可以被覆盖。 有人可以去testModule.publicAlert = function(){EVIL CODE OF DOOM;};,你的内部工作将很乐意执行它。

答案 1 :(得分:0)

我知道这与模块模式略有不同,但我认为它仍然提供了封装相同的好处。公共方法声明为:

this.methodName = function(){...}

变量$ this被分配给当前实例(this),因此您可以在私有(或公共)方法中使用它来访问该实例上的任何方法或属性。

福克:

http://jsfiddle.net/FNjJq/