Как я могу вызвать публичный метод изнутри частного при использовании шаблона модуля javascript? - PullRequest
9 голосов
/ 22 декабря 2010

Я хотел бы вызвать открытый метод из частного, но свойство "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 ]

11 голосов
/ 22 декабря 2010

Если вы хотите сделать это, вам нужно объявить 'публичную' функцию, как если бы вы работали с частной функцией, а затем выставить ее как публичную. Как это:

$(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();
});

[Изменить] Я также рекомендую вам привыкнуть к нажатию на кнопку «jslint» в верхней части jsfiddle, в вашем коде не хватает нескольких точек с запятой, и вы также повторно объявили переменную «text» внутри функции appendText (она уже была передана в)

Кроме того, вы используете шаблон модуля немного иначе, чем я его изучил. У вас есть ссылка на ваш справочный материал?

Вот как бы я сделал шаблон модуля, каким я его знаю: 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;};, и ваша внутренняя работа с радостью выполнит его.

0 голосов
/ 22 декабря 2010

Я понимаю, что это немного отличается от шаблона модуля, но я думаю, что он все еще предлагает те же преимущества инкапсуляции. Публичные методы объявлены как:

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

переменная $ this присваивается текущему экземпляру (this), поэтому вы можете использовать ее из закрытых (или открытых) методов для доступа к любым методам или атрибутам этого экземпляра.

Вилка:

http://jsfiddle.net/FNjJq/

...