3

次のように、モデルと単一のコントローラーに名前を付けます。

var MC = {};

必要に応じてプロパティを追加しました。

たとえば、すべてのモデルを初期化するコードは次のようになります。

MC.initAll = function() {

    MC.MASettings.init();
    MC.MATweet.init();

    MC.MUserTry.init();
    MC.MUserNew.init();
    MC.MUserExist.init();

    Su.UserOut.init();
    Su.Media.init();
}

これをループに変更する予定です... MC をループして、init() が存在する場合はそれを実行します。

このアーキテクチャについて唯一気になる点は、すべてが公開されているという伝統的な意味でのプライバシーやカプセル化がないことです。

また、モデルをインスタンス化するのではなく、関数として呼び出すだけですが、これは .js でのインスタンス化とほとんど同じです。

モデルにプライバシーを追加し、オブジェクトのプロパティとしてアクセスできるようにする簡単な方法はありますか?

例として、ここに私の最も単純なモデルがあります:

MC.MUserTry = {
    init: function() {
        document.getElementById( 'ut_but' ).addEventListener( "click", function( ) {
            MC.Controller( MC.o_p( 'MUserTry' ) );
        }, false );
    },
    pre : function( o_p ) {
        o_p.page.email = document.getElementById( 'ut_but' ).getAttribute( 'data-email' );
        return o_p; 
    },
    post : function( o_p ) {
        sLocal( o_p.server.hash, o_p.server.privacy, o_p.server.name, o_p.server.picture, 'ma' );
        vStateUpdate( o_p.server.name, o_p.server.picture, o_p.server.privacy );
        vTPane( o_p.server.tweets ); vBPane( o_p.server.bookmarks ); 
        vFlipP( 'ma' ); 
    }
};

pre() は ajax 呼び出しの前に実行され、post() はその後に実行され、init() は onload イベントなどを介して呼び出されます。

実際にこれを実装するコントローラーは次のとおりです。

MC.Controller = function( o_p ) {

   console.log( 'o_p = ' + o_p.model );

   var t1, t2, t3, t4, 
       i1, i2, i3, i4,
       o_p_string_send;

    if( SU.get('debug') ) {
        t1 = new Date().getTime();
    }

    o_p = MC[ o_p.model ].pre( o_p );  

    if ( o_p.result !== 'complete' ) {
        o_p_string_send = JSON.stringify( o_p );

        if( SU.get('debug') ) {
            t2 = new Date().getTime();
            console.log( '---------------Server Send: \n ' + o_p_string_send );
        } 

        cMachine( 'pipe=' + o_p_string_send , function( o_p_string_receive ) {

            if( SU.get('debug') ) { 
                console.log( '---------------Server Receive: \n ' + o_p_string_receive ); 
                t3 = new Date().getTime();
            }

            o_p.server = JSON.parse( o_p_string_receive );

            MC[ o_p.model ].post( o_p );

            if( SU.get('debug') ) {
                t4 = new Date().getTime(); i1 = t2-t1 ; i2 = t3-t2 ; i3 = t4-t3; i4 = o_p.server.time;
                console.log( '---------------Time: \n Pre | Transit | Post | Server = ', i1, ' | ', i2, ' | ', i3,' | ', i4 );  
            }

        } );
    }
};

プライバシーを追加したい。これを行うにはどうすればよいでしょうか? オブジェクト プロパティとしてモデルにアクセスできるように維持するにはどうすればよいですか?

関連している

ローカル スコープからグローバルなインスタンス ベースのオブジェクトを作成する方法は?

4

2 に答える 2

2

これはクロージャーで行うことができます。

var MyNamespace = {};
MyNamespace.MyClass = (function() {
    function privateMethod() {
        // ...
    }

    function publicMethod() {
        // can call privateMethod() from in here
    }

    return ({
        publicMethod: publicMethod
    });
}());

MyNamespace.MyClassこれにより、1 つのプライベート メソッドと 1 つのパブリック メソッドで呼び出されるオブジェクトが作成されます。あなたの場合、おそらくモデルクラスごとにこれを行いたいでしょう。メソッドinitを公開し、他のメソッドを非表示にします。

于 2012-08-03T23:28:52.740 に答える
1

モデルにプライバシーを追加し、オブジェクトのプロパティとしてアクセスできるようにする簡単な方法はありますか?

明らかに、オブジェクト全体を非公開にする必要があります。はい、これは JavaScript の他のプライバシーと同じように機能します - 閉鎖です。

モジュール パターンを見てください(これについては Web 上に多くのチュートリアルがあります)。

于 2012-08-03T23:20:33.243 に答える