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

在使用javascript模块模式时,如何从私有方法中调用公共方法?,javascript,module-pattern,Javascript,Module Pattern,我想从私有方法调用公共方法,但属性“this”指的是窗口对象 请注意,我正在尝试应用模块模式。您可以在以下位置找到工作代码示例: 如果您想做到这一点,您需要像声明私有函数一样声明“public”函数,然后将其公开为public。像这样: $(function() { var modulePattern = (function($) { var privateMethod = function() { appendText("called priva

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

请注意,我正在尝试应用模块模式。您可以在以下位置找到工作代码示例:


如果您想做到这一点,您需要像声明私有函数一样声明“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();
});
[编辑] 我还鼓励您养成单击JSFIDLE顶部的“jslint”按钮的习惯,您的代码缺少一些分号,并且您还重新声明了appendText函数中的“text”变量(它已经传入)

此外,您使用模块模式的方式与我学习的方式略有不同。你有参考资料的链接吗

这就是我所知道的模块模式的实现方式: [/编辑]

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

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(){厄运的邪恶代码;}和您的内部工作将愉快地执行它。

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

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

叉子:


您在那里所做的只是创建一个新对象。这根本不是模块模式。好吧,您只是在对象“modulePattern”中创建一个新对象“this”。因此,您不再应用该模式。谢谢您的反馈。对于不干净的代码,我很抱歉,我完全忘记了jslint按钮,因为我正在考虑我的问题:)这里有两个我用作模式参考的源代码:我认为您的解决方案将是最简单的一个,但是除了将publicAlert方法从private重新映射到public之外,是否有办法为“this”注入正确的作用域?采纳@david的建议,让它成为一个不必双重定义公共方法/属性的地方是的,在这两个链接中,它们都自动执行函数,而你没有这样做。你检查了我在底部添加的链接了吗?同样,我不是双重定义公共方法,它们只定义一次,然后通过返回对象公开。它与您所做的类似,只是您在返回返回对象之前构建了返回对象,这允许内部函数看到它。相当聪明!再重复一遍:“为“this”注入正确的范围”-你所问的没有真正意义。模块模式不应该包含“this”关键字。是的,您没有正确使用模块模式。您应该立即执行匿名函数,而不是使用“new”,并且您也不应该使用“this”关键字。您也不需要将模块包装在jquery的就绪处理程序中,只需要对其进行调用。看看这个:好答案已经存在了:
this.methodName = function(){...}