2011-06-29 11 views
4

を参照/単純なオブジェクトリテラル範囲に貼り付け私の構造のサンプルです:今は、ここで問題

this.is.a.really.long.namespace = { 

    inputs : {}, 
    buttons : {}, 
    panels : {}, 

    fn : { 

     abc : function() {}, 
     def : function() {} 

    } 

}; 

、あなたは私が自分のそれぞれの中に私の入力、ボタン、パネル、および機能を格納しています見ることができるようにオブジェクトリテラル。問題は、fn.abcfn.def、またはpage.fnの内部にある他の機能の範囲内にあります。私は、fnの機能の中から私のinputsbuttons、およびpanelsにアクセスしたいと思っています。

明らかに、私はthis.is.a.really.long.namespace.inputsと入力することができますが、わかりましたが、それはかなり長いので、ページ内のオブジェクトを参照する必要があるすべてのインスタンスでタイプする必要はありません。

inputs,buttonspanelsfnから直接参照できる方法はありませんか?

私は私が行うことができます考えていた:私はfn.abcthat.inputs内部を使用することができるようになる

fn : { 

    that : this.is.a.really.long.namespace, 

    abc : function() {}, 
    def : function() {} 

} 

が、その方法での懸念はありますか?私が知っておく必要があるオーバーヘッドの任意の並べ替え?または、これを達成するためのより良い方法がありますか?

答えて

0

[OK]を...ここに私がやってしまったものです:

this.is.a.really.long.namespace = { 

    inputs : { firstName : undefined }, 
    buttons : { submit : undefined }, 

    fn : { 

     root : undefined, 

     abc : function() { console.log(this.root.inputs.firstName); }, 
     def : function() { console.log(this.root.buttons.submit); } 

    }, 

    init : function() { 

     var self  = this, 
      fn  = self.fn, 
      inputs = self.inputs, 
      buttons = self.button; 

      fn.root = this; // this is the key 

      inputs.firstName = $("#first-name"); 
      buttons.submit = $("#submit-button"); 

     fn.abc(); 
     fn.def(); 

    } 

}; 
0

すべてのレベルにそのレベルを指すparentパラメータが含まれているようにオブジェクトを構築すると、そのようにデータにアクセスできます。 this similar questionをご覧ください。あなたがオブジェクト内の任意の場所に名前空間を参照する問題はないはずですそこから

var namespace = this.is.a.really.long.namespace 
this.is.a.really.long.namespace = { 

    root : namespace, 
    inputs : {}, 
    buttons : {}, 
    panels : {}, 

    fn : { 

     abc : function() {}, 
     def : function() {} 

    } 
}; 

0

私はこのような何かを検討します。

+0

あなたは 'VARルート=これを行うことはできません;'オブジェクトリテラル内。 –

+0

ダーン、そうです。私はなぜそこに置いたのかわからない、何かを考えていた... :( – thescientist

+0

yea ...それはしたいと思うよ。 –

2

これは問題ありません。もっと肉付け構築物が一般的に使用されて

短いスクリプト=オブジェクトheirarchiesの

  1. 少ない実行時間分解能
  2. 少ない文字数:実際には、あなたは、次の理由でオーバーヘッドを削減する可能性があります"モジュールパターン"。

    Javascriptは内部的にはかなり非効率的です(例:実際のインデックス配列はありません)ので、実行時検索を減らすために何かできるのは通常は良いことです。長い階層へのポインタを作成することは、毎回完全な階層を使用するよりもはるかに高速です。これはたぶん長いループでは大したことですが、読むのも簡単ですから、ちょっと速いというのは単なるボーナスです。欠点はありません。

    プロパティを追加 簡素化するためのjQueryを使用して、このような何かを行うことができますストレートのオブジェクトでこれを行うには、(編集)

    :あなたは、機能オブジェクト構築している場合

    this.is.a.long.namespace = {}; 
    $.extend(this.is.a.long.namespace, 
        { that: this.is.a.long.namespace, 
        ... // other properties 
        }); 
    

    は、一般的にかかわらず言えば、モジュールのパターンはより柔軟であり、スコープを使用してプライベート変数/オブジェクトを作成できるため、より優れています。

    this.is.a.long.namespace = (function() 
    { 
        var that = {}, 
         somePrivateVariable; 
        function privateFunction() { 
         ... 
        } 
        that.inputs = {}; 
        ... 
        // assign everything to "that" 
        return that; 
    }()); 
    
+0

あなたはthescientistの提案をすることはできません。私のプロジェクトの例では、どちらもうまくいきません。まず、 'fn.abc'の中で' this'を使って 'that'にアクセスしなければなりません。もし' this.that .inputs.whatever'これは、 'this.that.inputs'が定義されていないことを示すエラーを受け取ります。 –

+0

私は自分の投稿を最初に誤って読んでいましたが、オブジェクト定義と関数を混同しています。その場合はモジュールパターンを使用してオブジェクトを返すことができます。その場合はそのようにすることができます。 –

+0

* 1つの注意点 - 参照が*自体*の場合、まだ存在しないため動作しません。このように1つ上のレベルを参照したり、オブジェクトのスタブを最初に作成したりすることができます: 'this.is.a.long.namespace = {};'その後、その場合は、自己参照を追加することができます。 –