5

Widget オブジェクトを作成する Factory クラスがあります。Factory オブジェクトは、後で Widget オブジェクトの「プライベート メソッド」をコールバックして、何らかの ajax 情報を渡す必要があります。これまでのところ、私が思いついた唯一の実装は、プライベート メソッドをファクトリに返す Widget にパブリック メソッドを作成し、それ自体を削除することです。Factory は、プライベート メソッドへのポインタを保持しながら、新しい Widget を返します。 . 簡単な例を次に示します。

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;
        }
    }
}

私が求めている効果を達成するためのより良い方法はありますか、それともこれはかなり合理的なアプローチですか? 私はそれが機能することを知っていますが、注意すべき落とし穴に足を踏み入れているかどうかに興味があります。

4

2 に答える 2

1
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;
        }
    }
}
于 2011-06-21T10:56:07.477 に答える
0

オブジェクト指向の JavaScript (GWT コード内で主に 1 つまたは 2 つのライナーを使用) に十分に慣れていないため、実際に本当の回答を得ることができません (しかし、私の応答はコメントとしては少し長いことがわかりました...)

自己変更クラスは、落とし穴の大きな可能性を秘めているように思えます。

個人的には、JavaScript や Ruby など、実行できることを制限しない言語 (たとえ仕事で Java+GWT を使用しなければならない場合でも) を好みますが、愚かなことをしないように自己規律に頼ることができます。プライベート メソッドを強制するよりも、メソッド名の前に "_" を付けて (使用してはいけない場所では使用しないようにします)。JavaScript は本質的に、クレイジーなことを行う上で非常に制限されていないため、とにかく多くの規律が必要です。

使用後にメソッドを削除した場合; それを保護するために、同じことを行う新しいメソッドを同じように簡単に追加できませんか? とにかく、あなたはまだあなたの(そして他の人たちの)自己規律と正気に頼るでしょうね?

于 2011-06-21T10:51:32.050 に答える