2013-08-26 6 views
5

いつか、グローバル名前空間の乱雑さを軽減し、ライブラリのエクスポートを容易にするために、大きなオブジェクトにコードをラップして名前空間として使用することをお勧めしていると聞いたので。オブジェクト宣言前のメンバーメソッドの呼び出し

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: this.foo() 
}; 

「fooが定義されていません」と主張して失敗します。 オブジェクト宣言を終了する前にメソッドを呼び出すのはおそらく悪いので、私はbarを移動して機能しました。

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
}; 
wrapper.bar = wrapper.foo(); 

私は、これは特に、ネストされた名前空間とこのように、一種の醜いになることができると感じているので、それは難しい、一度にラッパーのメンバーのすべてを見ることにしない任意の回避策はありますか。

+0

あなたはいずれかを呼び出す必要がありますなぜ宣言のメソッド?おそらく直ちに呼び出される関数(* IEFE *)を使用したいと思うかもしれません。 *モジュールパターン*もチェックしてください。 – Bergi

答えて

1

問題は、thisがグローバルコンテキストに等しくなることです。あなたはそうのような機能にアクセスする必要があります。

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: null, 
    init : function() { 
     // all initialization code goes here 
     wrapper.bar = wrapper.foo(); 
    } 
}; 

wrapper.init(); 

この方法は、あなたと将来の開発者が簡単にあなたがJavaScriptで探しているものを見つけることができるように論理的な塊にあなたのコードを整理するための素晴らしいです。ラッパーは、1)関数でない限り、そのようなthisを使用して

+0

Hm、Chromeは「未定義のメソッド 'foo'を呼び出すことはできません」ということは、ラッパーが定義されていないことを意味していますか? –

+0

更新されたコードを使用可能にしました。このアーキテクチャの最も一般的な使い方は、すべての変数の初期化を行う何らかの種類のinit関数を含めることです。変数にDOMへの参照が含まれている場合、document.loadイベントで実行できます。あなたはDOMを検索します –

0

は動作しません、そして2)あなたはそれを使用するようにインスタンス化します。

var wrapper = function() { 
    this.foo = function() { return 42; } 
    this.bar = this.foo(); 
}; 

var wrapperInstance = new wrapper(); 
alert(wrapperInstance.bar()); // 42 
wrapperInstance.foo(); // also works 
+0

私は 'alert(wrapperInstance.bar); wrapperInstance.foo(); 'は、barが関数ではなく、ラッパーにメンバーがないことを考慮しています。これは、ラッパーのために残忍なようにも見えます。コンストラクタを作成することは、一度しか使用しないと愚かに思えるので... –

+0

はい、私はそれに応じてそれを編集します。それはばかげたことではない - シングルトンのパターンを考える。 :) –

関連する問題