9

プライベートメソッドからパブリックメソッドを呼び出したいのですが、プロパティ「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();
});
4

2 に答える 2

11

それを可能にしたい場合は、プライベート関数と同じように「パブリック」関数を宣言してから、それをパブリックとして公開する必要があります。このような:

$(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/ [/ Edit]

また、モジュールパターンを正しく使用すれば、次のようにモジュール名を使用してパブリック関数を参照できます。

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;};あり、あなたの内部の働きはそれを喜んで実行します。

于 2010-12-22T00:06:19.483 に答える
0

これはモジュールパターンとは少し異なることは理解していますが、それでもカプセル化の同じ利点を提供すると思います。パブリックメソッドは次のように宣言されます。

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

変数$thisは現在のインスタンス(this)に割り当てられているため、プライベート(またはパブリック)メソッド内から使用して、そのインスタンスの任意のメソッドまたは属性にアクセスできます。

フォーク:

http://jsfiddle.net/FNjJq/

于 2010-12-22T00:11:05.603 に答える