4

少し背景...

SineMaculaフォーム要素を作成し、これらのフォーム要素をページ上で実行させるための多くのメソッドを格納するというオブジェクトがあります。

まず、ページが読み込まれるとsetFields()、ページ上のすべてのフィールドをループして適切に設定するメソッドが呼び出されます。つまり、オートコンプリート、チェックボックスなど...

のコードはsetFields()次のようになります。

/**
 * Set Fields
 * This function will set all fields
 *
 * The options:
 * - fields: the fields selector to loop through
 *
 * @param object options The field options
 */
SineMacula.prototype.setFields = function (options){
    // Set the defaults for the fields
    var options = $.extend({
        fields: '.field', // Define the default field selector
    },options);
    // Loop through the fields and set the events
    $(options.fields).each(function(){
        // Set the field events
        SineMacula.setBlur($(this));        
        SineMacula.setFocus($(this));
        SineMacula.setToggleLabel($(this));
        // If the field is a checkbox then set it
        if($(this).parent().hasClass('checkbox')){
            SineMacula.setCheckbox($(this).parent());
        }
        // If the field is an autocomplete then set it
        if($(this).parent().hasClass('autocomplete')){
            SineMacula.setDropdown($(this).parent(),{source:$(this).attr('data-source')});
        }
        // etc...
    });
};

上記のコードのほとんどは無視できますが、私が何をしているのかを正確に確認できるように、すべて挿入しました。

私の質問

、...SineMaculaなど、オブジェクトのかなりの数のメソッドがあります。setCheckbox()setDropdown()

私が知りたいのは、これらのメソッド自体をオブジェクトとして扱うべきですか?

したがって、私のコードは次のようになります。

if($(this).parent().hasClass('autocomplete')){
     new SineMacula.dropdown($(this).parent(),{source:$(this).attr('data-source')});
}

newメソッドを呼び出す前にキーワードに注意してくださいdropdown()

これは物事を処理するためのより良い方法ですか?使用するメモリなどは少なくなりますか?

4

3 に答える 3

3

コンストラクターを呼び出してオブジェクトを破棄するためだけにオブジェクトのインスタンスを作成する理由はありません。コンストラクターで作業を行うことにより、それを通常の関数として使用しているだけですが、未使用のオブジェクトを作成するオーバーヘッドが伴います。

(実際、メソッドの名前空間として以外には、SineMacula インスタンスを使用していないようです。)

于 2012-10-30T19:00:10.857 に答える
2

一般的な経験則として、何らかの責任を委任する必要がある場合、新しいオブジェクトが表示されます。したがって、後でそのようなことをした場合、sineMaculaInstance.setCheckboxValue(checkbox, true)それは間違いなくチェックボックスの責任であるように見えます。それを見る別の方法は、Single Macula オブジェクトをSingle Responsibility Principleによって分析することです。要するに、オブジェクトの動作を 1 行または 2 行で説明できれば、通常は問題ありません。SineMacula が何をするかを記述するために段落全体を書かなければならない場合、そのオブジェクトをリファクタリングして、具体的な責任を他のオブジェクトに分割する必要があるように見えます。

HTH

于 2012-10-30T19:24:38.427 に答える
1

このSineMacula名前空間/モジュール内にすべてのメソッドを格納しているため、別のまったく新しい SineMacula オブジェクトを再インスタンス化する目的はないように思えます。

元のオブジェクトに添付したくない、ページの特定のセクションまたはフォーム要素に固有の、異なる/特定のプロトタイプ/メソッドを追加する場合を除きます。

var newThing = new SineMacula('doDifferentStuff');
newThing.dropdown = '''do something different''';

クラスをインスタンス化する全体的な理由は、 newthis呼び出し元に設定することでもあります。そして、あなたが持っているものはすべてすでに一緒に結び付けられているようで、単にSineMacula.setBlahblah呼び出し自体を使用しています。

あまりにも文字化けしないことを願っています!

于 2012-10-30T19:11:58.807 に答える