«Классы друзей» в javascript - PullRequest
4 голосов
/ 21 июня 2011

У меня есть класс Factory, который создает объект Widget.Объекту Factory необходимо позднее вызвать «закрытый метод» объекта Widget, чтобы передать ему некоторую информацию ajax.Пока что единственная реализация, которую я придумал, - это создание открытого метода в Widget, который возвращает приватный метод фабрике, а затем удаляет себя, Factory затем возвращает новый виджет, сохраняя указатель на приватный метод,Вот упрощенный пример:

function Factory()
{
    var widgetCallback = null;

    this.ajaxOperation = function()
    {
        //some ajax calls
        widgetCallback('ajaxresults');
    }

    this.getNewWidget = function()
    {
        var wid = new Widget();
        widgetCallback = wid.getCallback();
        return wid;
    }

    function Widget()
    {
        var state = 'no state';
        var self = this;
        var modifyState = function(newState)
        {
            state = newState;
        }

        this.getState = function()
        {
            return state;
        }

        this.getCallback = function()
        {
            delete self.getCallback;
            return modifyState;
        }
    }
}

Есть ли лучший способ достичь желаемого эффекта или это достаточно разумный подход?Я знаю, что это работает, просто любопытно, если я вступлю в какие-либо ловушки, о которых я должен знать.

Ответы [ 2 ]

1 голос
/ 21 июня 2011
this.getNewWidget = function() {
    var val = new Widget(),
        wid = val[0],
        widgetCallback = val[1];

    return wid;
}

function Widget() {
    var state = 'no state';
    var self = this;
    var modifyState = function(newState) {
        state = newState;
    }

    this.getState = function() {
        return state;
    }

    // Return tuple of Widget and callback
    return [this, modifyState];
}

Просто попросите вашего конструктора вернуть Tuple<Widget, function>

В качестве альтернативы просто используйте область закрытия для редактирования widgetCallback непосредственно в конструкторе Widget

function Factory() {
    var widgetCallback = null;

    this.ajaxOperation = function() {
        //some ajax calls
        widgetCallback('ajaxresults');
    }

    this.getNewWidget = function() {
        return new Widget();;
    }

    function Widget() {
        var state = 'no state';
        var self = this;
        // set it directly here!
        widgetCallback = function(newState) {
            state = newState;
        }

        this.getState = function() {
            return state;
        }
    }
}
0 голосов
/ 21 июня 2011

Я недостаточно знаком с объектно-ориентированным JavaScript (я использую в основном один или два вкладки внутри кода GWT), чтобы на самом деле дать реальный ответ (но я обнаружил, что мой ответ был немного длинным для комментария ... )

Я думаю, что самоизменяющиеся классы звучат как большой потенциал для гоча.

Я лично предпочитаю такие языки, как JavaScript, Ruby и т. Д., Которые не ограничивают то, что вы можете сделать (даже если мне приходится использовать Java + GWT на работе, хе-хе), но когда вы полагаетесь на самодисциплину, чтобы не делать глупостей вещи. Я предпочел бы префикс имени метода с «_» (и просто избегать его использования там, где я не должен), чем пытаться применять частные методы. Поскольку JavaScript по своей природе очень неограничен в том, что вы можете делать сумасшедшими, он все равно требует большой дисциплины.

Если вы удалили метод после использования; чтобы защитить его, не могли бы вы так же легко добавить новый метод, чтобы сделать то же самое? Вы все равно будете полагаться на свою (и других) самодисциплину и здравомыслие, не так ли?

...