5

コードを 20 ~ 60 行のモジュール (通常はモジュール パターン) に編成しています。整形式のオブジェクト指向 JavaScript ライブラリが必要です。

これはこれを行うための最良の方法ですか?コードはテスト済みで動作します。

プログラマーがライブラリからモジュールをプルして、必要に応じて使用できるので、私はそれが好きです。それらは自己完結型です。

ツール、メッセージ、エフェクト、テキストはすべて NS に含まれています。

質問?

これはライブラリを整理するための良い方法 (ベスト プラクティス) ですか?

ノート

これまでのところ、コメントと回答のコンセンサスは 0 です...非常にイライラします。

アウターモジュールパターン

var NS = ( function ( window, undefined ) 
{ 
/* All Modules below here */ 
} )( window );

ツール

/**
 *Tools
 *    getTimeLapse - benchmark for adding
 */

var Tool = ( function () 
{
    var Tool = function ( ) 
    {
    };
    Tool.prototype.getTimeLapse = function( numberOfAdds ) 
    {
        var end_time;
        var start_time = new Date().getTime();
        var index = 0;           
        while ( index <= numberOfAdds )
        {
            index++;
        }
        end_time = new Date().getTime();
        return ( end_time - start_time );
    };
    return Tool;
} () );

メッセージ

/**
 *Message
 *    element - holds the element to send the message to via .innerHTML
 *    type - determines the message to send
 */

var Message = ( function () 
{
    var messages = 
    {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        email_s:      'Please enter a valid email.',
        pass:         'Please enter passoword, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:foo@foo.com">support</a> to reset your password',
    };
    var Message = function (element) 
    {
        this.element = element;
    };
    Message.prototype.display = function( type ) 
    {
        this.element.innerHTML = messages[ type ];
    };
    return Message;
} () );

効果

/**
 *Effects
 *    element - holds the element to fade
 *    direction - determines which way to fade the element
 *    max_time - length of the fade
 */

var Effects = ( function () 
{
    var Effects = function ( element )
    {
        this.element = element;
    };
    Effects.prototype.fade = function( direction, max_time ) 
    {
        var element = this.element;
        element.elapsed = 0;
        clearTimeout( element.timeout_id );
        function next()
        {
            element.elapsed += 10;
            if ( direction === 'up' )
            {
                element.style.opacity = element.elapsed / max_time;
            }
            else if ( direction === 'down' )
            {
                element.style.opacity = ( max_time - element.elapsed ) / max_time;
            }
            if ( element.elapsed <= max_time ) 
            {
                element.timeout_id = setTimeout( next, 10 );
            }
        }
        next();
    };
    return Effects;
} () );

文章

/**
 *Text
 *    form_elment - holds text to check
 */

var Text = ( function () 
{
    var Text = function ( form_element )
    {
        this.text_array = form_element.elements;
    };
    Text.prototype.patterns = 
    {
        prefix_url:     /^(http:)|(https:)\/\//,
        aml:            /<(.+)_([a-z]){1}>$/,
        url:            /^.{1,2048}$/,
        tweet:          /^.{1,40}$/, 
        title:          /^.{1,32}$/,
        name:           /^.{1,64}$/, 
        email:          /^.{1,64}@.{1,255}$/,
        pass:           /^.{6,20}$/
    };
    Text.prototype.checkPattern = function( type ) 
    {
        return this.patterns[ type ].exec( this.text_array[type].value );
    };
    Text.prototype.checkUrl = function( type ) 
    {
        return this.patterns[ type ].exec( this.text_array.url.value );
    };
    Text.prototype.checkSameEmail = function() 
    {
        return ( ( this.text_array.email.value ) === ( this.text_array.email1.value ) );
    };
    Text.prototype.checkEmpty = function() 
    {
        for ( var index = 0; index < this.text_array.length; ++index ) 
        {
            if ( this.text_array[ index ].value === '') 
            { 
                return 0; 
            }
        }
        return 1;
    };
    return Text;
} () );
4

3 に答える 3

2

コードをよりクリーンにし、フットプリントを減らすために変更することをお勧めする1つのことは、プロトタイププロパティを一度に設定することです。

Object.prototype.method1 = function(){};
Object.prototype.method2 = function(){};

あなたがやる

Object.prototype = {
    method1: function(){},
    method2: function(){}
};

推奨されるコンストラクター参照を保存する必要がある場合は、後でコンストラクターを再割り当てする必要があります。詳細については、この回答を参照してください

于 2012-04-12T19:28:06.387 に答える
1

個人的には、 ncoreのようなモジュラー コード編成ライブラリを使用することを好みます。

これにより、コードを一連のモジュール (ファイルごとに 1 つのモジュール) として記述し、依存性注入とブートストラップを使用してそれらを結合することが推奨されます。

モジュールはそれ自体が単なるオブジェクトであるため、コードはわずかに移植可能ですが、ncore を使用しないと利点が失われます。

リーダーボード アプリは、OO コード編成の詳細な例を示しています

于 2012-04-12T19:23:51.157 に答える
1

いくつかの提案...最初に、ライブラリのスコープとして名前空間オブジェクトを作成することです.jQueryは「jQuery」と「$」を使用し、アンダースコアは「_」を使用します。「CompanyName.SiteName」を使用する傾向があります

if (typeof CompanyName == "undefined") var CompanyName = {};
CompanyName.SiteName = CompanyName.SiteName || {};

最初の行は undefined を明示的にチェックします。これは、多くのブラウザでエラーが発生するためです。それ以外の場合は、SiteName プロパティのメソッドを使用してルート変数をチェックします。

そこから、いくつかの調整を行います...無名関数をインラインで呼び出す場合は、呼び出し全体を括弧内にラップするのが最善です。

CompanyName.SiteName.ModuleName = (function(w){
    ...
    return moduleImplementation;
}(window || this)); //CompanyName.SiteName.ModuleName

これは、括弧で全体を囲み、モジュール宣言の最後にコメントを付けることで、混乱を避ける傾向があります。

上記のコメントに従って、プロトタイプ宣言をより特異なステートメントとして作成することをお勧めします。モジュールが長くなると読みやすさが問題になる可能性があるため、これには反対することをお勧めします。

myModule.prototype = {
    "method1": function(){
    }
    ...
    "methodN": function(){
       //by the time you get here, you may not see the top, and where you are nested in
    }
};

//with the dot-notation, or hash notation
myModule.prototype.methodN = ...
myModule.prototype["methodN"] = ...
//you can see where you are binding to at that function

RequireJSAMDも調べてみてください。

より単純なオブジェクトを扱い、機能的なバインダーを使用するという概念もあります。ライブラリを、渡されてより単純なオブジェクト/タイプで動作する一連の関数 (C エクスポートと同様) として扱います。それは本当にあなたのニーズ/使用法とあなたのニーズと使用法の詳細に依存します.

いくつかの例については、 KnockoutJSUnderscoreBackboneなどの JavaScript ライブラリも参照してください。

于 2012-04-12T19:48:33.733 に答える