2011-12-14 1 views
3

最近、私は が間違っていることについて何人かの同僚と議論しています。 私たちは、大規模なアプリケーションでバックボーンを使用していて、ビューを作成するための私の方法は 「標準」のバックボーンの方法です:Backbone.View.extendに関数を渡します。

var MyView = Backbone.View.extend({ 
    className: 'foo', 
    initialize: function() { 
    _.bindAll(this, 'render' /* ... more stuff */); 
    }, 
    render: function() { 
    /* ... render, usually 
     using _.template and passing 
     in this.model.toJSON()... */ 
    return this; 
    } 
}); 

しかし、チームの誰かが最近、このようにそれを行うことを決めた。

var MyView = Backbone.View.extend((function() { 
    /* 'private stuff' */ 
    function bindMethods(view) { 
    _.bindAll(view, /* ... more stuff */); 
    }; 
    function render(view) { 
    /* ... render, usually 
     using _.template and passing 
     in view.model.toJSON()... */ 
    }; 
    return { 
    className: 'foo', 
    initialize: function() { 
     bindMethods(this); 
     render(this); 
    } 
    }; 
}()); 

これは擬似コードのアイデアです。 は、事前に

感謝をBBのソースを読んで、私はこれが(私にとって、それは意味をなさない) 悪い習慣であることがわかり記事をチュートリアルを読んで、私は 他のバックボーンの開発者/ユーザーからのいくつかのフィードバックを愛したいました

+0

私は個人的に、そのようなクロージャーでビューを配置する必要はないと見なされますが、可読性が低下します。 – c4urself

+0

大いに同意しました。それは読めない...しかし、それ以上のことは、これが混乱につながると思う。あなたのフィードバックに感謝します –

答えて

2

私がクロージャを使用することからわかる1つの利点は、ビュー外のコードからアクセスしたくない変数と関数のプライベートスコープを提供することです。

たとえそうだとしても、私は多くのバックボーンのアプリを見ていないビュー/モデル/コレクションを定義するためにクロージャを使うなど

ここでも、この問題についてのジェレミー・アッシュケナスからのメールです。

はい、JavaScriptでプライベート変数を持つオブジェクトのインスタンスを作成するためにクロージャを使用することは可能です。しかし、それは悪い習慣であり、避けるべきです。これは特にバックボーンとは関係がありません。 JavaScriptのOOPの本質です。

閉包パターン(「モジュール」パターンとも呼ばれます)を使用する場合は、作成する各インスタンスごとに各関数の新しいコピーを作成します。これはプロトタイプを完全に無視し、スピードの点で、特にメモリー使用の点で非常に非効率的です。 10,000個のモデルを作成した場合、各メンバ関数のコピーも10,000個になります。 prototypes(Backbone.Model.extend)を使用すると、クラスのインスタンスが10,000個であっても、各メンバ関数のコピーが1つしかありません。

+0

はい、それはこの「自己呼び出し」機能の主な目標でした。 フィードバックありがとう –

+0

バックボーンGoogleディスカッショングループ(https://groups.google.com/group/backbonejs/browse_thread/thread/7a748cf87e2dcd74)に投稿したのと同じトピックのアップデートです。 これは絶対に避けるべきです –

0

私はポールと全く同意します。場合によっては、プライベートで外部から混乱することのないメソッドやプロパティを定義する必要があることがあります。私はそれがあなたのクラスでこのスコープのメカニズムを必要とするかどうかに依存していると思います。両方のアプローチを混在させると、クラスの要件に関して、それほど悪くはありませんか?

関連する問題